将不同类型的变量写入二进制文件,然后将它们读入 class 变量会给出错误的值

Writing variables of different types to binary file and then reading them into class variables gives wrong values

我正在尝试创建从二进制文件读取到 class 的变量。整数被正确读取和显示,但 double 得到一个奇怪的值。我不确定这里发生了什么。命令windows的输出是:

98
366
7
-9.25596e+61

这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>

class text
{
private:
    int var1, var2, var3;
    double var4;
public:
    int getVar1() { return var1; }
    int getVar2() { return var2; }
    int getVar3() { return var3; }
    double getVar4() { return var4; }
};

using namespace std;

int main()
{
    // Create test binary file
    FILE* file = fopen("D:\Desktop\TestFile", "wb");

    // Define test variables
    int var1 = 98, var2 = 366, var3 = 7;
    double var4 = 52.13;

    // Write test variables to file
    fwrite(&var1, sizeof(var1), 1, file);
    fwrite(&var2, sizeof(var2), 1, file);
    fwrite(&var3, sizeof(var3), 1, file);
    fwrite(&var4, sizeof(var4), 1, file);

    fclose(file);

    // Read from file into class
    FILE* input;
    input = fopen("D:\Desktop\TestFile", "rb");
    text t;
    fread(&t, sizeof(t), 1, input);

    cout << t.getVar1() << endl << t.getVar2() << endl << t.getVar3() << endl << t.getVar4() << endl;

    fclose(input);

    return 0;
}

允许编译器填充您的 struct,在这种情况下它会这样做:

这是打印出 3 个整数的大小 + 1 个双精度数的大小与 text (demo) 的实例大小的测试:

class text
{
private:
 int var1, var2, var3;
 double var4;
public:
 int getVar1() { return var1; }
 int getVar2() { return var2; }
 int getVar3() { return var3; }
 double getVar4() { return var4; }
};

int main()
{
    std::cout << sizeof(int) + sizeof(int) + sizeof(int) + sizeof(double) << " versus " << sizeof(text) << std::endl;
}

输出:

20 versus 24

发生这种情况是因为编译器喜欢对齐事物(并且可以自由对齐,除非您另有说明)。

相反,我建议您为 text 重载 >> 运算符,使用 std::ifstreamstd::ofstream,因为您使用的是 C++,并读入成员直接。