C ++支持非ASCII数据文件

时间:2012-12-23 09:11:56

标签: c++ c file-io format

我找不到任何关于如何用C ++编写和读取非ASCII文件的参考。

我想创建我的文件格式,同时表达文件内部信息的精确模式和标记,但基本上使用fstream我只能创建文本文件。文本模式或二进制模式对于此目的并不重要,结果始终是ASCII文件。

如何逐个字节地写一个文件,就像你不能简单地用文本编辑器解析一样,它们有自己的定义?

4 个答案:

答案 0 :(得分:6)

您想要的是将文件视为字节流,这可以通过使用read()和write()来实现。当文件不是文本时直接处理文件时,不能使用普通流操作符<< >>

通常你会在read()/ write()之上创建自己的读/写函数来重载流操作符

另一种方法是使用fread()fwrite(),你在其中创建一个带有记录布局的结构,然后在fread()/ fwrite()

中使用它
typedef struct
{
   short id;
   char name[64];
} rec;

rec A;

fread( &A, sizeof(A), 1, fp );

答案 1 :(得分:4)

如果你有一个文件,你不能“用编辑器阅读”,它只是意味着数据不是以文本形式存储的。正如其他人所说,C和C ++在文本和二进制形式的文件之间没有太大区别 - 它只是关于转换(例如行结尾)和约定的一些简单规则(例如,文件末尾可以用字符标记,因为文件长度以块为单位,但我们不希望文本文件中有512字节块的精确倍数,因此CTRL-D或CTRL-Z用于标记文件的结尾。在二进制模式下,“任何事情都会发生”。

在许多方面,二进制文件非常类似于文本文件,因为编译器不知道您的数据代表什么。如果文本文件包含:

12345 Glurg 12.88
1Ab9Z Flarf 6.89

这将是你的程序决定第一列是产品ID(读取第一行,你认为它是一个整数,但由于第二行不能表示为整数,它必须存储作为一个字符串),第二个是产品名称,第三个是价格,也许?还是体重? (以公斤,克,磅,吨?)

因此,对于二进制文件,您的程序也需要知道每个字节或字节集的含义。

如果它是一种众所周知的格式(PDF,Excel电子表格或类似的东西),可能有免费或购买的库可以处理该格式。如果没有,您需要很好地描述文件本身的格式,并使用上述的读/写或streambuf功能。

如果格式是你自己的,或者至少不是超级便携的,你可以形成具有正确格式的结构,并将这些结构作为一个读操作读取,并写为一个写操作。如果格式是可移植的,那可能不会起作用 - 并且要注意读取和编写结构的方法不那么便携,因为编译器可能会在结构中留下空白,这取决于机器的体系结构。

答案 2 :(得分:2)

C ++不直接支持任何二进制格式。主要原因是没有通常使用的二进制格式,但有许多不同的格式。流缓冲区(即从std::streambuf派生的类)可用于从外部目标读取字节或将字节写入外部目标,但您需要创建一组合适的二进制格式化输入和输出函数

答案 3 :(得分:0)

没有本机支持,如果你想实现类似的东西,请使用序列化。