繁体   English   中英

从二进制文件读取双精度

[英]Reading double from binary files

需要格式化,编辑将花费一些时间。

使用fin >> d和使用fin.read进行fin.read做不同的事情。 fin >> d工作时,似乎您有一个文件,其中写入了double的字符串表示形式。 使用fin.read表示您的文件是用二进制编写的,似乎不是。 另外,您最好使用sizeof(double)而不是硬编码常量8

问题是您误解了std::ifstream::read函数的语义。 根据C ++参考:

注意:此文档适用于std :: istream,但适用于ifstream

std :: istream :: operator >>()

应用于输入流的该运算符(>>)被称为提取运算符。 作为以下成员函数的重载:

arithmetic types

从流中顺序提取和解析字符, 以将它们解释为适当类型的值的表示形式,该类型存储为val的值 在内部,该函数通过首先构造一个哨兵对象(noskipws设置为false)来访问输入序列。 然后(如果良好),它将调用num_get :: get(使用流的选定区域设置)以执行提取和解析操作,从而相应地调整流的内部状态标志。 最后,它在返回之前销毁了哨兵对象。

stream buffersmanipulators

而对于std :: istream :: read

此函数仅复制数据块,而不检查其内容或在末尾添加空字符。

因此,当您这样做时:

double d;
...
fin >> d;

您正在将double存储到double var中。 但是...

如果您这样做:

double d;
...
fin.read((char*)&d, ...);

您正在告诉c ++:好的,这里(&d)我有一个地址,我希望您对它进行评估,因为它是char* (强制转换)。 该函数可以执行您想要的操作。 但是正如您在doc中看到的那样,该函数将在&d放入&d您期望的无关的数据块

这就是为什么operator>>可以工作而read不能工作的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM