如何将ASCII和BINARY数据同时写入同一文件

时间:2012-05-15 20:17:00

标签: c++ file-io vtk paraview

我为输出使用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 个答案:

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