12

在某些情况下我必须更喜欢二进制文件而不是文本文件吗?我使用 C++ 作为编程语言?

例如,如果我必须存储一些大文本文件,是使用文本文件还是二进制文件更好?

编辑

目前该文件没有人类可读的要求。是否有一些性能差异、安全差异等?

编辑

抱歉省略了其他要求(感谢 Carey Gregory)

  • 要保存的记录采用 ascii 编码
  • 该文件必须加密(AES)
  • 机器可以随时断电。所以我必须尽量防止错误。
  • 我必须知道文件是否在程序之外更改,我想我会使用文件的 sha1 摘要。
4

6 回答 6

16

作为一般规则,定义文本格式并使用它。开发和调试要​​容易得多,如果它不起作用,也更容易看出哪里出了问题。

如果您发现文件变得太大,或者通过网络传输需要很长时间,请考虑压缩它们。压缩的文本文件通常比二进制文件小。或者考虑一种不那么冗长的文本格式;可以使用比 XML 使用的字符少得多的字符可靠地传输数据的文本表示。

最后,如果您最终不得不使用二进制文件,请尝试选择现有格式(例如 Google 的协议块),或者将您的格式建立在现有格式的基础上。请记住:

  • 二进制比文本要多得多,因为实际上您必须重新编写所有运算符,包括标准库中的运算<<符。

  • 二进制文件更难调试,因为你不能轻易看到你实际做了什么

关于您的最后一次编辑:

  • 加密后,结果将是二进制的。您可以使用二进制的文本表示(base64 或类似的),但结果不会比二进制更具可读性,因此不值得费心。如果您正在加密过程中,在写入磁盘之前,您会自动失去文本的所有优势。

  • 关机问题意味着不能直接使用 ofstream。您必须使用必要的选项打开或创建文件以实现完整的事务完整性(O_SYNC作为openUnix 下的标志)。您必须将每条记录作为单个write请求写入系统。

  • 有一个校验和总是一个好主意,以防万一。如果您担心安全性,SHA1 是一个不错的选择。但请记住,如果有人有权访问该文件,并且想要有意更改它,他们可以重新计算 SHA1 并插入新值。

于 2013-05-21T14:10:56.443 回答
15

所有文件都是二进制文件;其中的数据是某些信息的二进制表示。如果您必须存储大量文本,则该文件将包含该文本的二进制表示。“二进制文件”和“文本文件”之间的区别在于创建后者涉及在保存数据之前将数据转换为文本形式。通常这样做是为了让人类可以阅读它。

在存储供计算机使用的数据时,通常会区分二进制和文本。通常,此数据不会是文本 - 它可能是数字配置值列表,例如:1, 2, 3.

如果您以文本格式存储它,您的文件可能包含人类可读的数字列表,如果您在记事本中打开文件,您可能会看到每行一个数字。但是您实际上在这里保存的不是二进制值1, 2, 3- 您正在保存一个 string "1\n2\n3\n"。请注意,此字符串有 6 个字符长,二进制值(假设为 ASCI)实际上是49, 10, 50, 10, 51, 10!

如果相同的数据以二进制格式存储,您会将数字存储在最小的有用空间中,并将文件作为单个字节写入,这些字节通常只能由创建它们的代码读取。在记事本中打开此文件可能会显示垃圾字符,因为数据作为文本没有意义。在这种情况下,您将保存一个包含实际值的字节数组{ 1, 2, 3 }- 甚至是嵌入三个值的单个字节。这可能比人类可读的等价物要小得多。

于 2013-05-21T13:01:06.650 回答
5

二进制文件像所有其他文件一样存储一系列字节。您可以存储数字值,例如每 4 个字节的整数、每单字节的字符,甚至是序列化的类对象以及您想要的任何东西。

当您知道如何读取二进制文件(即您知道其中存储了什么)时,您可以从中提取所有信息。但是,文本文件使用 UTF8、ANSI 等文本编码,它们旨在对文本字符进行编码以供文本编辑器处理。

于 2013-05-21T13:04:14.540 回答
2

二进制文件仅供机器解释,而文本文件,人类也可以打开和解释其内容。

因此,这取决于您是否希望您的文件可供人类阅读。

于 2013-05-21T12:57:30.827 回答
1

这取决于很多因素。我现在能想到两个:

  • 您是否要求文件可供人类阅读?

  • 压缩是一个因素吗?一个 10 位数字至少需要 10 个字节作为文本,但可能只需要四到两个二进制。

于 2013-05-21T12:58:50.303 回答
0

存储在文本文件中的所有数据都是人类可读的图形字符。每行数据都以换行符结束。在二进制文件的情况下 - 数据以与存储在内存中相同的格式存储。没有行或换行符。有一个文件结束标记。

此外,二进制文件显示出更高的内存效率,因为它们以 0 和 1 的形式存储。

于 2016-07-07T13:47:46.023 回答