将不同类型的变量写入二进制文件,然后将它们读入 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::ifstream
和 std::ofstream
,因为您使用的是 C++,并读入成员直接。
我正在尝试创建从二进制文件读取到 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::ifstream
和 std::ofstream
,因为您使用的是 C++,并读入成员直接。