C++ fstream产生了非常奇怪的行为

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::

当我在文件流中写入一个double,然后写入一个整数时,这个整数作为额外的数字附加到double之后,我不知道为什么会发生这种情况。有人能给我解释一下吗?最简单的例子:

#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的文件
  • 它将值
    3.14
    写入文件(8字节)
  • 它将值
    36
    写入文件(4字节)
  • 它跳回到缓冲区的开头
  • 它读取一个双类型值(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";
    }
}