当想到所有文件都转换为 XML时,确实是一件好事。但是,这并非事实。仍旧还有大量的文件格式不是XML,甚至也不是ASCII。二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递。相比之下,在处理这些问题方面,它们比文本文件显得更有效率些。
在 C 和 C++ 中,读取二进制文件还是很容易的。除了一些开始符(carriage return)和结束符(line feed)的问题,每一个读到C/C++中的文件都是二进制文件。事实上,C/C++ 只知道二进制文件,以及如何让二进制文件像文本文件一样。当我们使用的语言越来越抽象时,我们最后使用的语言就不能直接、容易的读取创建的文件了。这些语言想要用它们自己独特的方式来自动处理输出数据。
问题的所在
在许多计算机科学领域,C 和 C++ 仍旧直接依照数据结构来储存和读取数据。在C和C++中,依照内存中的数据结构来读取和写文件,是十分简单的。在C中,你只需要使用fwrite()函数,并提供下列参数:一个指向你的数据的指针,告诉它有多少个数据,一个数据有多大。这样,就直接用二进制格式把数据写成文件了。
如上所述的那样把数据写成文件,同时如果你也知道其正确的数据结构的话,那么也就意味着读取文件也很容易。你只要使用 fread() 函数,并提供下列参数:一个文件句柄,一个指向数据的指针,读取多少个数据,每一个数据的长度。 fread() 函数帮你把其余的事都做了。突然,数据又回到了内存中。没有采用解析以及也没有对象模型的方式,它只是把文件直接的读到内存中。
在C和C++中,最大的两个问题就是数据对齐(structure alignment)和字节交换(byte swapping)。数据对齐指的是有时编译器会跳过数据中间的字节,因为如果处理器访问到那些字节,就不再处于最优化状态下了