C ++ бинарный файл с записями: строка в начале - PullRequest
0 голосов
/ 04 июня 2011

Я борюсь с чтением из двоичного файла.

Мой двоичный файл состоит из записей таким образом:

строка - 5 х целых чисел

Первая строка имеет разную длину, так что я думаю, это может быть моей проблемой?

Я пытаюсь прочитать запись в классе, который имеет атрибуты того же типа:

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 ]

1 голос
/ 04 июня 2011

Больше нечего добавить к ответу Нила, но я бы посоветовал вам взглянуть на повышение сериализации .
Если ваш формат файла не фиксированный и вы можете легко его изменить, это будетдействительно поможет вам избежать многих ловушек при сериализации.

1 голос
/ 04 июня 2011

Да, если вы хотите сделать ввод-вывод на основе записей, тогда все записи должны иметь одинаковую длину. и основанный на записи ввод / вывод - редкий случай, когда использование массива 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 ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...