2012-05-15 40 views
3

我使用VTK数据类型来处理输出。由于我的数据越来越大,用ASCII编写它需要相当长的时间,这就是我迄今为止所做的。如何将ASCII和BINARY数据同时写入同一个文件

我需要将其更改为二进制格式,但问题是该文件有一些标题(请参阅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 *是* binary。什么是问题? –

+1

我阅读了链接到的PDF文件的一部分,我发现问题出在哪里,是的。它们的确如同ASCII是不同于二进制的。但是不要让他们欺骗你,只需要使用一个作者('ios :: binary')就可以了。 –

+0

@MrLister非常感谢。我很困惑,认为它们本质上是两个不同的东西。 – GradGuy

回答

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