[英]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 buffers
和manipulators
。
此函数仅复制数据块,而不检查其内容或在末尾添加空字符。
因此,当您这样做时:
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.