我正在阅读二进制文件。
我的二进制文件由记录组成,如:
string - 5 x整数
第一个字符串有不同的长度,所以我想这可能是我的问题?
我尝试将记录读入具有相同类型属性的类:
class Team
{
private:
string teamName;
int matchesPlayed;
int gamesWon;
int gamesLost;
int pointsWon;
int pointsLost;
public:
Team(string ="",int = 0,int = 0, int = 0, int = 0, int = 0);
~Team();
//void operator<();
void setTeamName(string);
void setMatchesPlayed(int);
void setGamesWon(int);
void setGamesLost(int);
void setPointsLost(int);
void setPointsWon(int);
void print();
};
我尝试从另一个班级读入:
Table::Table()
{
Team t1;
teams.push_back(t1);
ifstream inputFile;
inputFile.open("tabletennis.dta", ios::in | ios::binary);
if(!inputFile)
{
cout << "Datei konnte nicht geoeffnet werden!";
exit(1);
}
if(inputFile.good())
inputFile.read(reinterpret_cast<char*> (&t1), sizeof(Team));
t1.print();
}
Team :: print()只打印出其属性的内容。但是当我尝试打印字符串时,程序崩溃了。
我不知道我可能理解错误..但我的想法是:
使用相同的属性数和类型读取对象是如何读取记录集的方法:
Team::Team(string teamName, int matchesPlayed, int gamesWon, int gamesLost, int pointsWon, int pointsLost)
{
setTeamName(teamName);
setMatchesPlayed(matchesPlayed);
setGamesWon(gamesWon);
setGamesLost(gamesLost);
setPointsWon(pointsWon);
setPointsLost(pointsLost);
}
暂时不知道..
答案 0 :(得分:1)
是的,如果你想做基于记录的I / O,那么记录必须真正具有相同的长度。基于记录的I / O是一个罕见的场合,使用char数组可能比std :: string更好。我会改变这个:
class Team
{
private:
string teamName;
int matchesPlayed;
int gamesWon;
int gamesLost;
int pointsWon;
int pointsLost;
为:
class Team
{
private:
char teamName[NAMESIZE];
int matchesPlayed;
int gamesWon;
int gamesLost;
int pointsWon;
int pointsLost;
然后你可以读写:
Team t( .... ); // construct a team
os.write( (const char *) & t, sizeof( t ) );
并阅读:
Team t; // default construct empty team
is.read( (char *) & t, sizeof( t ) );
答案 1 :(得分:1)
除了Neil的答案之外,还有什么可以补充的 我建议你看一下boost serialization 如果您的文件格式没有修复,并且您可以轻松更改它,这将真正帮助您避免序列化中的大量陷阱。