写入文本文件时如何表示双打?

时间:2015-02-26 17:23:54

标签: c++ file format double

当您为文件写入多个双打时,它们以哪种格式存储?是字节格式还是字符串格式?

E.g。给出0.00083231。它是以10个字节存储的,每个字节代表一个数字吗?或者它只存储为8个字节,因为double的大小是8个字节?

假设使用的语言是C ++。

4 个答案:

答案 0 :(得分:1)

如果您选择撰写文字,例如使用格式化的输出,如file << x,您将获得文本。

如果您选择写字节,例如使用未格式化的输出,如file.write(&x, sizeof x),您将得到字节。

答案 1 :(得分:1)

问题:

  

当您为文件写入多个双打时,它们以哪种格式存储?是字节格式还是字符串格式?

这取决于您使用哪些函数来编写数字。

E.g:

如果您使用fprintfprintf,则会以文字形式写出该号码,在您的示例中,该格式将写为0.000832,格式为{{1}并将占用8个字节。您可以更改格式以更改用于写出数字的字节数。结果输出将是人类可读的形式。如果您使用"%lf",则相同。

如果您使用cout << number;,则该号码将以二进制形式写入。无论数字的值如何,存储该数字所需的字节数始终为fwrite。结果输出将不是人类可读的。如果您使用sizeof(double),则相同。

答案 2 :(得分:1)

这取决于您打印值的方式

如果您将数字打印为二进制值,它将在文件中取sizeof(double)个字节(并不总是8),并且您无法使用普通文本查看器读取该值/编辑。您必须使用二进制/十六进制编辑器以二进制格式查看它。

如果使用文本输出功能打印数字,结果取决于您格式化的方式。如果您使用cout格式使用std::printf%f系列中的函数,则会使用 6位有效数字打印该值,因此它只需要8最多以文本格式表示的字节数。如果使用不同的长度/宽度说明符(例如printf("%9.10f\n", 0.00083231)),那么打印的实际字节当然会有所不同。使用其他格式也会产生不同的打印格式输出。例如%e将打印出来在您的情况下,科学格式的字符串8.323100e-04,并在输出字符串中至少占用12个字节。%a将以十六进制形式打印出值,除了值之外,它将更长完全可以用二进制表示。请参阅实例here

答案 3 :(得分:0)

这取决于你如何写它们。您可以使用std::ostream及其(重载)operator <<;然后它们以文本形式存储。您可以使用二进制IO,例如std::ostream::writefwrite然后它们以本机二进制形式存储。

您可能应该阅读有关serialization的更多信息,并考虑使用JSON等文字格式(例如jsoncpp)。您可能对二进制序列化感兴趣,例如libs11nXDR

请注意,数据通常比代码更重要,并且磁盘IO或网络IO比CPU慢很多(例如至少数千次)。因此,花费CPU时间来使数据更容易存储通常是值得的。此外,相同的数据可以写在一台机器上,并读取一些非常不同的数据。

另请阅读persistencedatabasesapplication checkpointingendianness。另请参阅this