【问题标题】:Writing a mixof ascii and binary data in Fortran在 Fortran 中编写混合的 ascii 和二进制数据
【发布时间】:2019-07-09 23:23:30
【问题描述】:

我正在尝试为 vtk 文件格式数据编写如下所示的 ASCII 和二进制数据的混合。

我了解二进制或 ASCII 区别必须在文件打开语句中进行(在 FORM='BINARY' 中,最好是: ACCESS='STREAM' )。我不明白如何为我需要的格式编写文件。

我要输出的内容:

ascii keyword  
ascii keyword  
ascii keyword  
ascii keyword  
ascii keywords "variable value in ascii" ascii keywords   
.....SOME BINARY DATA ....
.....................

我正在使用什么:

write(fl) "# vtk DataFile Version 3.0"//CHAR(13)//CHAR(10)  
write(fl)"Flow Field"//CHAR(13)//CHAR(10)  
write(fl)"BINARY"//CHAR(13)//CHAR(10)  
write(fl)"DATASET UNSTRUCTURED_GRID"//CHAR(13)//CHAR(10)  
write(fl)"POINTS",npoints,"float"    -------------> gives value of npoints(example:8) in binary format

输出应该是什么:

# vtk DataFile Version 3.0
Flow Field
BINARY
DATASET UNSTRUCTURED_GRID
POINTS 8 Float
.....SOME BINARY DATA ....
.....................

输出是什么:

# vtk DataFile Version 3.0
Flow Field
BINARY
DATASET UNSTRUCTURED_GRID
POINTSÒ^O^@^@float
.....SOME BINARY DATA ....
...................

【问题讨论】:

  • Form="Binary" 不是 Fortran。您能否更详细地描述您要实现的目标(而不是您尝试解决它的方式),然后也许我们可以提出解决方案。
  • @Ian Form='BINARY' 也是fortran格式。它与 FORM='UNFORMATTED' 的效果大致相同,只是文件中没有嵌入记录长度。我将编辑关于我正在尝试做什么的问题。
  • Form="Binary" 是非标准的,因此并非所有编译器都支持。您可能想要 Access="stream"。请看software.intel.com/en-us/forums/…
  • 感谢您的指出!我将使用 access='stream'。我已经更新了我正在尝试做的事情。

标签: fortran ascii binaryfiles vtk


【解决方案1】:

首先,你会在网上找到编写VTK文件的例子,比如各种开源研究代码中的问题binary vtk for Rectilinear_grid from fortran code can not worked by paraviewBinary VTK for RECTILINEAR_GRID from fortran code,比如https://bitbucket.org/LadaF/elmm/src/866794b5f95ec93351b0edea47e52af8eadeceb5/src/simplevtk.f90?at=master&fileviewer=file-view-default(这个是我的简化例子,有很多更多)或在专用库中,如 http://people.sc.fsu.edu/~jburkardt/f_src/vtk_io/vtk_io.html(还有一个用于 XML VTK 文件的 VTKFortran 库)。

因此,即使您在 Windows 上,也不应该在 VTK 二进制文件中使用 Windows 行结束约定。以achar(10)(或iso_fortran_env 中的new_line 常量)结束你的行。并且不要忘记二进制数据必须是 bigendian。上面的链接中有如何处理的示例。

第三,要将整数放入字符串,我们有大量的重复项。我的意思是真的巨大。从Convert integers to strings to create output filenames at run time 开始,我会在那里厚颜无耻地推荐我的itoa 函数,因为它会大大简化你的代码。

write(fl)"POINTS ",itoa(npoints)," float" 

【讨论】:

  • I will shamelessly recommend my itoa function there, because it will simplify your code a lot.我会厚着脸皮用它,好简单的功能。
【解决方案2】:

我会替换

write(fl)"POINTS",npoints,"float"

BLOCK
   integer, parameter :: big_enough = 132 ! Or whatever
   character(big_enough) line
   write(line,'(*(g0))')"POINTS ",npoints," Float"//achar(13)//achar(10)
   write(f1) trim(line)
END BLOCK

【讨论】:

  • 很遗憾,我使用的是 pgi 编译器,它不支持 Block Construct
  • BLOCK 的唯一原因是我可以隔离声明。如果您将 BLOCK 构造的 specification-part 移动到封闭范围的 specification-part 中,则不需要使用高输入阻抗 BLOCK构造。
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多