需要格式化,编辑需要一些时间。
答案 0 :(得分:0)
使用fin >> d
阅读并使用fin.read
做了不同的事情。当fin >> d
工作时,似乎你有一个文件,其中写入了double的字符串表示。使用fin.read
表示您的文件是用二进制文件编写的,而它似乎不是。另外,您最好使用sizeof(double)
代替硬编码常量8
。
答案 1 :(得分:0)
问题在于你错过了std::ifstream::read
函数的语义。根据C ++参考:
注意:此文档适用于std :: istream,但适用于ifstream
应用于输入流的此运算符(>>)称为提取运算符。它作为成员函数重载:
arithmetic types
从流中依次提取和解析字符,将它们解释为正确类型值的表示形式,该值存储为val 的值。 在内部,该函数首先构造一个sentry对象(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
中添加数据块,这与您期望的walue无关。
为operator>>
工作的原因read
没有。