我为输出使用VTK数据类型。由于我的数据越来越大,用ASCII编写它需要相当长的时间,而这正是我迄今为止所做的。
我需要将其更改为二进制格式,但问题是该文件有一些标题(请参阅http://www.vtk.org/VTK/img/file-formats.pdf),即使对于二进制文件也需要用ASCII编写。
现在我对二进制格式没有足够的经验,我的第一次尝试是通过
打开两个流ofstream asciiWriter(file_name.c_str());
ofstream binWriter(file_name.c_str(), ios::app | ios::binary);
问题是输出似乎没有组织,asciiWriter
和binWriter
没有以正确的顺序输出,因此我无法在ParaView中对我的文件进行后期处理。我尝试过的一件事是每当我完成标题/数据写入时都使用asciiWriter.flush()
和binWriter.flush()
,但这也无济于事。
我该怎么办?
PS:我不想使用VTK软件包......它很大并且增加了我的代码依赖性!
答案 0 :(得分:5)
在我所知道的所有现代系统中,二进制文件和文本文件之间的唯一区别是C运行时库处理换行符和文件结束字符。具体来说,在* nix系统上,文本和二进制文件的行为完全相同。在Windows上,将'\n'
写入文本文件会导致'\r'
(CR)后跟'\n'
(LF)写入实际文件;阅读"\r\n"
对会显示为单个'\n'
。同样在Windows上,从文本文件中读取'\x1A'
(Ctrl-Z,EOF)表示文件结束条件。二进制文件是逐字读取和写入的,没有转换。
阅读您的文档时,我注意到它在行尾仅指定'\n'
(不是"\r\n"
)。这表明正确的方法是将标题读取和写入二进制文件,即使在Windows上也是如此。
作为一个无关紧要的东西,一些旧的系统(RSX-11和VMS浮现在脑海中)的二进制文件在磁盘上与文本文件截然不同。他们还直接在操作系统中支持基于记录和索引的文件。但是,他们修改了open()
,fopen()
等函数的版本(以及其他语言中的等价函数)来处理打开文件时可以指定的过多参数。在这样的系统上,每次都必须使用正确的文件模式。