如何同时将 ASCII 和 BINARY 数据写入同一个文件
How to write ASCII and BINARY data to the same file at the same time
我使用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软件包本身...它很大,增加了我的代码依赖性!
在我所知道的所有现代系统上,二进制文件和文本文件之间的唯一区别是 C 运行时库对换行符和文件结尾字符的处理。 具体来说,在 *nix 系统上,文本和二进制文件的行为完全相同。 在 Windows 上,将'n'
写入文本文件会导致将'r'
(CR( 后跟'n'
(LF( 写入实际文件;读取"rn"
对显示为单个'n'
。 同样在 Windows 上,从文本文件中读取'x1A'
(Ctrl-Z、EOF(表示文件结束条件。 二进制文件是逐字读取和写入的,无需转换。
阅读您的文档时,我注意到它在行尾仅指定'n'
(而不是"rn"
(。 这表明正确的方法是将标头作为二进制文件读取和写入,即使在Windows上也是如此。
顺便说一句,一些较旧的系统(想到RSX-11和VMS(的二进制文件在磁盘上与文本文件截然不同。 他们还直接在操作系统中支持基于记录的文件和索引文件。 但是,他们修改了open()
,fopen()
等函数的版本(以及其他语言中的等效函数(,以处理打开文件时可以指定的大量参数。 在这样的系统上,您每次都必须使用正确的文件模式。
- 当 PHP、C++ 和 shell 脚本尝试访问同一个文件时,如何避免错误?
- 为什么 boost 文件系统和 libpq-fe 标头不会在同一个文件中编译
- 如何在同一个文件中写入C++
- fopen 和 fwrite 从多个线程到同一个文件
- C "undefined reference",但我在同一个文件中指定了它
- 我可以允许多个程序同时从同一个文件中读取吗
- 如何检查文件指针/描述符/句柄是否关联到同一个文件/管道/终端
- 如何同时将 ASCII 和 BINARY 数据写入同一个文件
- C++内联函数的定义必须在同一个文件中
- C++使用不同的流读取和写入同一个文件
- 两个进程打开同一个文件进行写入
- C++未定义的引用,尽管函数是在同一个文件中定义的
- 读/写同一个文件(获取gmon.out)
- 如何使用Boost.Filesystem检查两个路径是否指向同一个文件/目录
- 多次映射同一个文件
- 读取和写入同一个文件fstream
- 未定义的引用错误,即使应该包含的文件在同一个文件夹中
- 使用不同的访问模式C++将多个指针指向同一个文件
- (Windows)同时打开同一个文件
- 使用ifstream在两个线程中处理同一个文件