带记录的C ++二进制文件:开头的字符串

时间:2011-06-04 14:22:02

标签: c++ string file binary

我正在阅读二进制文件。

我的二进制文件由记录组成,如:

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);
}

暂时不知道..

2 个答案:

答案 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 如果您的文件格式没有修复,并且您可以轻松更改它,这将真正帮助您避免序列化中的大量陷阱。