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

How to write ASCII and BINARY data to the same file at the same time

本文关键字:同一个 文件 数据 BINARY 何同时 ASCII      更新时间:2023-10-16

我使用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软件包本身...它很大,增加了我的代码依赖性!

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

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

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