在Fortran中编写混合的ASCII和二进制数据

时间:2019-02-15 19:11:41

标签: fortran ascii binaryfiles vtk

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

我知道必须在文件OPEN语句(以FORM ='BINARY',最好是:ACCESS ='STREAM')中进行二进制或ASCII区分。我不明白如何以所需的格式编写文件。

我要输出的内容:

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 ....
...................

2 个答案:

答案 0 :(得分:0)

我会替换

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

答案 1 :(得分:0)

首先,您会在互联网上找到编写VTK文件的示例,例如各种{@ 3}}等开放源代码研究代码中的问题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(还有XML VTK文件的VTKFortran库)。

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

第三,要将整数放在字符串中,我们有大量重复项。我的意思是真的很大。从http://people.sc.fsu.edu/~jburkardt/f_src/vtk_io/vtk_io.html开始,我会毫不客气地向我推荐itoa函数,因为它将大大简化您的代码。

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