我有两个应用程序,一个读者和一个作家。
我正在撰写和阅读的数据是本课程的成员:
ProcessBean<?>
struct和enum是:
class MyClass
{
public:
MyClass(){}
~MyClass(){}
public:
//Getters and setters are removed for simplicity
void write(std::ofstream& ofile);
void read(std::ifstream& file);
private:
Aenum a= Aenum_0;
double b= 0.0;
double c= 0.0;
double d= 0.0;
double e= 0.0;
char charArr1[5];
char charArr2[5];
char charArr3[5];
char charArr4[10];
date_and_time time;
};
写入功能:
struct date{
int day = 1;
int month = 1;
int year = 2017;
};
struct hhmmss{
int hours = 1;
int minutes = 1;
int seconds = 1;
};
struct date_and_time {
date d;
hhmmss t;
};
enum Aenum = {Aenum_0, Aenum_1, Aenum_2};
读取功能:
void MyClass::write(std::ofstream& ofile){
ofile.write((char*)&a, sizeof(int));
ofile.write((char*)&b, sizeof(double));
ofile.write((char*)&c, sizeof(double));
ofile.write((char*)&d, sizeof(double));
ofile.write((char*)&e, sizeof(double));
ofile.write(&charArr1[0], sizeof(char)*5);
ofile.write(&charArr2[0], sizeof(char)*5);
ofile.write(&charArr3[0], sizeof(char)*5);
ofile.write(&charArr4[0], sizeof(char)*10);
ofile.write((char*)&time, sizeof(date_and_time));
}
然后在我的作家应用程序中我这样做:
void MyClass::read(std::ifstream& file){
file.read((char*)&a, sizeof(int));
file.read((char*)&b, sizeof(double));
file.read((char*)&d, sizeof(double));
file.read((char*)&d, sizeof(double));
file.read((char*)&e, sizeof(double));
file.read(charArr1, sizeof(char)*5);
file.read(charArr2, sizeof(char)*5);
file.read(charArr3, sizeof(char)*5);
file.read(charArr4, sizeof(char)*10);
file.read((char*)&time, sizeof(date_and_time));
}
在读者中我这样做:
bool writeToBinaryFile(std::vector<myClass>& myClassCollection, const std::string& outputPath){
std::ofstream ofile;
ofile.open(outputPath);
if (!ofile.is_open())
return false;
date_and_time dtnow = getDateAndTimeNow();
ofile.write((char*)&dtnow, sizeof(date_and_time));
int numberOfmyClass = myClassCollection.size();
ofile.write((char*)&numberOfmyClass, sizeof(int));
for (int i = 0; i < myClassCollection.size(); i++)
myClassCollection[i].write(ofile);
ofile.close();
return true;
}
我知道类成员中的数据是完整的。我有另一个功能,我写入ASCII文件,没有丢失的数据。
当我读取二进制文件时,我得到了该类前15位(200+)成员的正确数据。然后突然我正在阅读的值是 garbage ,好像有些字节不应该存在。
所以我要问的是;我做的事情显然是错的吗?如果没有,调试这样一个问题的最佳方法是什么?