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);

问题是输出似乎杂乱无章,asciiWriter并且binWriter没有以正确的顺序输出,因此我无法在 ParaView 中对文件进行后处理。我尝试过的一件事是使用asciiWriter.flush()binWriter.flush()每当我完成标题/数据写入,但这也无济于事。

我该怎么办?

PS:我不想使用 VTK 包本身......它的巨大并增加了我的代码依赖!

4

1 回答 1

5

在我所知道的所有现代系统上,二进制文件和文本文件之间的唯一区别是 C 运行时库对换行符和文件结尾字符的处理。具体来说,在 *nix 系统上,文本和二进制文件的行为完全相同。在 Windows 上,将 a 写入'\n'文本文件会导致将'\r'(CR) 后跟'\n'(LF) 写入实际文件;读取一"\r\n"对显示为单个'\n'。同样在 Windows 上,从文本文件中读取'\x1A'(Ctrl-Z, EOF) 表示文件结束条件。二进制文件是逐字读取和写入的,没有转换。

阅读您的文档,我注意到它仅在行尾指定'\n'(不是)。"\r\n"这表明正确的方法是将标头作为二进制文件读取和写入,即使在 Windows 上也是如此。

顺便说一句,一些较旧的系统(想到 RSX-11 和 VMS)在磁盘上具有与文本文件截然不同的二进制文件。他们还直接在操作系统中支持基于记录和索引的文件。但是,他们修改了open(), fopen()etc 函数的版本(以及其他语言的等效函数)来处理打开文件时可能指定的过多参数。在这样的系统上,您每次都必须使用正确的文件模式。

于 2012-05-15T20:36:14.537 回答