从二进制文件中读取两倍

时间:2014-04-11 10:05:02

标签: c++ file binary double

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题在于你错过了std::ifstream::read函数的语义。根据C ++参考:

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

std::istream::operator>>()

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

arithmetic types

  

从流中依次提取和解析字符,将它们解释为正确类型值的表示形式,该值存储为val 的值。       在内部,该函数首先构造一个sentry对象(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中添加数据块,这与您期望的walue无关。

operator>>工作的原因read没有。

相关问题