C++ fstream产生了非常奇怪的行为
当我在文件流中写入一个double,然后写入一个整数时,这个整数作为额外的数字附加到double之后,我不知道为什么会发生这种情况。有人能给我解释一下吗?最简单的例子:C++ fstream产生了非常奇怪的行为,c++,debugging,fstream,C++,Debugging,Fstream,当我在文件流中写入一个double,然后写入一个整数时,这个整数作为额外的数字附加到double之后,我不知道为什么会发生这种情况。有人能给我解释一下吗?最简单的例子: #include <iostream> #include <fstream> int main() { std::fstream s("test.bin", std::fstream::binary | std::fstream::trunc | std::fstream::in | std::
#include <iostream>
#include <fstream>
int main()
{
std::fstream s("test.bin", std::fstream::binary | std::fstream::trunc | std::fstream::in | std::fstream::out);
s << 3.14;
int n = 36;
s << n;
s.seekp(0);
double d;
s >> d;
printf("%f\n", d);
}
#包括
#包括
int main()
{
std::fstream s(“test.bin”,std::fstream::binary | std::fstream::trunc | std::fstream::in | std::fstream::out);
sd;
printf(“%f\n”,d);
}
我期望发生的事情:
- 程序将打开一个名为test.bin的文件
- 它将值
写入文件(8字节)3.14
- 它将值
写入文件(4字节)36
- 它跳回到缓冲区的开头
- 它读取一个双类型值(8字节)
- 它打印值(显示
)3.140000
程序输出
3.143600
——我完全不知道为什么会发生这种情况。这毫无意义。如果我将初始值从3.14
更改为18.3204
,那么它将输出18.320436
。发生了什么?在流上操作时,
执行格式化访问。忽略幕后伏都教,
读字符串。所以
s << 3.14;`
将文件读取为字符串,查找分隔的空格或任何其他无法转换为双精度值的字符。由于文件中没有分隔3.14和36的内容,因此3.1436将作为单个数字读回
您需要做的是使用原始的、未格式化的读写:
#include <iostream>
#include <fstream>
int main()
{
std::fstream s("test.bin",
std::fstream::binary | std::fstream::trunc |
std::fstream::in | std::fstream::out);
double d = 3.14;
int n = 36;
if (s.write((char*) &d, sizeof(d)) &&
s.write((char*) &n, sizeof(n)))
{
s.seekp(0);
if (s.read((char*) &d, sizeof(d)))
{
std::cout << d;
}
else
{
std::cerr << "failed to read\n";
}
}
else
{
std::cerr << "failed to write\n";
}
}
#包括
#包括
int main()
{
std::fstream s(“test.bin”,
std::fstream::binary | std::fstream::trunc|
std::fstream::in | std::fstream::out);
双d=3.14;
int n=36;
if(s.write((char*)&d,sizeof(d))&&
s、 写入((char*)&n,sizeof(n)))
{
s、 seekp(0);
if(s.read((char*)&d,sizeof(d)))
{
标准::cout
它将值3.14写入文件(8字节)
它将值36写入文件(4字节)
这不是实际情况。>
和使用std::cout
而不是一些输出文件流。然后问问自己,如果您是一个简单的double
提取算法,您将如何决定停止读取数字的位置。您的输出double
和输出int
之间没有空格。哟你意识到这是格式化输出,对吗?它不是将双精度值写入8个纯字节吗?不,如果你想将原始平台相关的八位字节原始写入,请使用write
和read
方法。
#include <iostream>
#include <fstream>
int main()
{
std::fstream s("test.bin",
std::fstream::binary | std::fstream::trunc |
std::fstream::in | std::fstream::out);
double d = 3.14;
int n = 36;
if (s.write((char*) &d, sizeof(d)) &&
s.write((char*) &n, sizeof(n)))
{
s.seekp(0);
if (s.read((char*) &d, sizeof(d)))
{
std::cout << d;
}
else
{
std::cerr << "failed to read\n";
}
}
else
{
std::cerr << "failed to write\n";
}
}