当您为文件写入多个双打时,它们以哪种格式存储?是字节格式还是字符串格式?
E.g。给出0.00083231。它是以10个字节存储的,每个字节代表一个数字吗?或者它只存储为8个字节,因为double的大小是8个字节?
假设使用的语言是C ++。
答案 0 :(得分:1)
如果您选择撰写文字,例如使用格式化的输出,如file << x
,您将获得文本。
如果您选择写字节,例如使用未格式化的输出,如file.write(&x, sizeof x)
,您将得到字节。
答案 1 :(得分:1)
问题:
当您为文件写入多个双打时,它们以哪种格式存储?是字节格式还是字符串格式?
这取决于您使用哪些函数来编写数字。
E.g:
如果您使用fprintf
或printf
,则会以文字形式写出该号码,在您的示例中,该格式将写为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::write或fwrite
然后它们以本机二进制形式存储。
您可能应该阅读有关serialization的更多信息,并考虑使用JSON等文字格式(例如jsoncpp)。您可能对二进制序列化感兴趣,例如libs11n或XDR
请注意,数据通常比代码更重要,并且磁盘IO或网络IO比CPU慢很多(例如至少数千次)。因此,花费CPU时间来使数据更容易存储通常是值得的。此外,相同的数据可以写在一台机器上,并读取一些非常不同的数据。
另请阅读persistence,databases,application checkpointing,endianness。另请参阅this。