我找不到任何关于如何在 C++ 中编写和读取非 ASCII 文件的参考。
我想创建我的文件格式,同时表达文件内信息的精确模式和标记,但基本上fstream
我只能创建文本文件。文本模式或二进制模式对于这个目的并不重要,结果总是一个 ASCII 文件。
如何逐字节编写文件,就像您不能简单地用文本编辑器解析并且它们有自己的定义的文件一样?
您想要的是将文件视为字节流,这可以通过使用 read() 和 write() 来实现。<< >>
当文件不是文本时,直接处理文件时不能使用普通流运算符。
通常你会在 read()/write() 之上创建你自己的读/写函数来重载流操作符
另一种方法是使用 fread() fwrite() 在其中创建具有记录布局的结构,然后在 fread()/fwrite() 中使用它
typedef struct
{
short id;
char name[64];
} rec;
rec A;
fread( &A, sizeof(A), 1, fp );
如果您有一个无法“使用编辑器读取”的文件,则仅表示数据未以文本形式存储。正如其他人所说,C 和 C++ 在文本和二进制形式的文件之间没有太大区别——它只是一些关于转换(例如行尾)和约定(例如文件结尾可以用字符标记)的简单规则,因为文件长度以块为单位,但我们不希望文本文件中有 512 字节块的精确倍数,因此使用 CTRL-D 或 CTRL-Z 来标记文件的结尾)。在二进制模式下,“任何事情都会发生”。
在许多方面,二进制文件在编译器不知道您的数据代表什么方面非常类似于文本文件。如果文本文件包含:
12345 Glurg 12.88
1Ab9Z Flarf 6.89
将由您的程序决定第一列是产品 ID(读取第一行,您会认为它是一个整数,但由于第二个不能表示为整数,它必须存储为字符串),第二个是产品名称,第三个是价格,也许吧?还是重量?(以公斤、克、磅、吨为单位?)
因此,同样对于二进制文件,您的程序需要知道每个字节或字节集合的含义。
如果它是一种众所周知的格式(PDF、Excel 电子表格或类似的格式),则可能有可以免费或购买的库来处理该格式。如果没有,您需要对文件本身的格式进行很好的描述,并使用上面描述的读/写或 streambuf 功能。
如果格式是您自己做的,或者至少不是超级可移植的,您可以形成具有正确格式的结构,并将这些结构作为一个读取操作读取,并将这些结构作为一个写入操作写入。如果该格式旨在是可移植的,那可能不起作用 - 并且要注意读取和写入结构的方法不是那么可移植,因为编译器可能会在结构中放置间隙,这取决于机器的体系结构。
C++ 不直接支持任何二进制格式。主要原因是没有普遍使用的二进制格式,但有许多不同的格式。流缓冲区(即派生自 的类std::streambuf
)可用于从外部目的地读取字节或将字节写入外部目的地,但您需要创建一组合适的二进制格式输入和输出函数。
对此没有本机支持,如果您想实现类似的功能,请使用序列化。