如何同时将ASCII和二进制数据写入同一个文件?

5
我处理输出时使用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);

问题是输出似乎杂乱无序,而 asciiWriterbinWriter 没有按正确顺序输出,因此我无法在 ParaView 中进行后处理。我尝试过的一件事是在头文件/数据写入完成后使用 asciiWriter.flush()binWriter.flush(),但这也没有帮助。

我该怎么做?

PS:我不想使用 VTK 包本身……它很大,并且会增加我的代码依赖性!


1
ASCII 二进制的。问题是什么? - Kerrek SB
1
我阅读了你提供的PDF文件的部分内容,我看到问题所在了。是的,他们似乎把ASCII当作与二进制不同的东西。但不要被他们愚弄,只需使用一个带有ios::binary的写入器即可。这样就没问题了。 - Mr Lister
@MrLister非常感谢。我很困惑,以为它们本质上是两个不同的东西。 - mmirzadeh
1个回答

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()等函数(以及其他语言中的等效函数)来处理打开文件时可以指定的大量参数。在这样的系统上,您必须每次使用正确的文件模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接