C++ 文件二进制与文本
在某些情况下,我是否必须选择二进制文件而不是文本文件?我用C++作为编程语言? 例如,如果我必须存储一些大的文本文件,最好使用文本文件还是二进制文件? 编辑 目前,该文件不要求可读。是否存在一些性能差异、安全性差异等? 编辑 很抱歉,省略了其他要求(感谢Carey Gregory)C++ 文件二进制与文本,c++,file,C++,File,在某些情况下,我是否必须选择二进制文件而不是文本文件?我用C++作为编程语言? 例如,如果我必须存储一些大的文本文件,最好使用文本文件还是二进制文件? 编辑 目前,该文件不要求可读。是否存在一些性能差异、安全性差异等? 编辑 很抱歉,省略了其他要求(感谢Carey Gregory) 要保存的记录采用ascii编码 文件必须加密(AES) 这台机器可以随时关机。所以我必须努力防止错误 我必须知道,如果文件在程序外更改,我想我将使用文件的sha1摘要 二进制文件只供机器解释,而文本
- 要保存的记录采用ascii编码
- 文件必须加密(AES)
- 这台机器可以随时关机。所以我必须努力防止错误
- 我必须知道,如果文件在程序外更改,我想我将使用文件的sha1摘要李>
因此,这取决于您是否希望您的文件能够被人读取 这取决于很多因素。我现在可以想到两个:
- 您是否要求该文件可供人类阅读
- 压缩是一个因素吗?一个10位数字至少需要10个字节作为文本,但可能需要4到2个字节作为二进制
1、2、3
如果以文本格式存储,则文件可能包含人类可读的数字列表,如果在记事本中打开文件,则每行可能会看到一个数字。但实际上您在这里保存的不是二进制值1,2,3
——而是一个字符串“1\n2\n3\n”
。请注意,此字符串的长度为6个字符,二进制值(假设为ASCI)实际上是49、10、50、10、51、10
如果相同的数据以二进制格式存储,则将数字存储在最小的有用空间中,并将文件作为单个字节写入,这些字节通常只能由创建它们的代码读取。在记事本中打开此文件可能会显示垃圾字符,因为数据作为文本没有意义。在本例中,您将使用实际值
{1,2,3}
-保存一个字节数组,甚至是一个嵌入了三个值的单个字节。这可能比人类可读的等效文件小得多。二进制文件与所有其他文件一样存储字节序列。您可以存储数字值,如每4个字节的整数、每单字节的字符,甚至可以存储序列化的类对象以及任何您想要的内容
当你知道如何读取二进制文件时(即你知道其中存储了什么),你就可以从中提取所有信息。但是,文本文件使用UTF8、ANSI等文本编码,用于对文本编辑器处理的文本字符进行编码。一般来说,定义文本格式并使用它。太多了 更容易开发和调试,并且更容易查看 如果它不起作用就会出问题 如果您发现文件变得太大,或者 很多时间在电线上传输,考虑压缩它们。 压缩文本文件通常比您使用的文件小 二元的。或者考虑较少冗长的文本格式;这是可能的 要可靠地传输数据的文本表示形式,请使用 比XML使用的字符少得多 最后,如果您最终不得不使用二进制,请尝试选择 现有格式(例如Google的协议块)或您的基础 现有格式上的格式。请记住:
- 二进制文件比文本要多得多,因为实际上
必须写入所有文本文件中存储的所有数据都是人类可读的图形字符。每行数据都以新行字符结尾。 在二进制文件的情况下,数据以与存储在内存中相同的格式存储。没有行或新行字符。有一个文件结束标记
此外,二进制文件存储在0和1中,内存效率更高。为什么不简化问题,告诉我们您的要求是什么?如果您的数据是ASCII文本,那么您为什么要将其存储为其他内容?除非您有诸如压缩或加密之类的要求,否则没有理由更改数据的编码,并且有很多理由不这样做。另一个要求是加密(AES)Wow,这是一个需要忽略的主要要求。对于第二个pont,一位数字将占用2个字节作为文本(因为它可能需要分隔符),“但可能很容易将4作为二进制。”詹姆斯坎茨不想吹毛求疵,但你假设的是一个单字节字符集,它不适用于地球上一半以上的人口。使用Unicode时,至少需要4个字节,最多需要8个字节来存储一个数字加分隔符。@请仔细记录所有常用数字和大多数常用分隔符都是UTF-8中的一个字节。你不会再写其他东西了。@JamesKanze假设他不需要支持CJK语言,这是真的,但如果他需要,他将需要UTF-16。@CareyGregory为什么他需要UTF-16?除非您确定该文件将仅在本地使用,即在写入该文件的计算机上使用,否则您永远不会真正地将UTF-16读写到文件中。用于数据传输的统一约定(今天,仍然有许多使用ISO 8859或JIS的遗留代码)是UTF-8,UTF-8经过精心设计,因此所有的字符