Форум портала Metropolis

Высокие технологии и мобильный мир => Софт и интернет => Тема начата: DStandout от 22 Ноябрь 2011, 19:57



Название: Вопрос по C++
Отправлено: DStandout от 22 Ноябрь 2011, 19:57
Этот кусок кода выводит последнюю структуру в файле два раза:
int printRec(cities city) {
    cout << "Name of the city: ";
    cout << city.name << "\n";
    cout << "Population of the city: ";
    cout << city.pop << "\n";
    cout << "Area of the city: ";
    cout << city.area << "\n";
    cout << "Year of foundation of the city: ";
    cout << city.year << "\n";
    cout << "Number of schools in the city: ";
    cout << city.schools << "\n";
    return 0;
}

int readRec(char path[]) {
    cities city;
    ifstream in(path);
    while (!in.eof()) {
        in.read((char *) &city, sizeof(cities));
        printRec(city);
    }
    in.close();
    return 0;
}

Хотя если записать две структуры и посмотреть на файл, там их действительно две. А выводит три.
До этого записывается в файл вот таким образом:
int readStr(cities &city){
    cout << "Input information.\n";
    cout << "Name of the city: ";
    cin >> city.name;
    cout << "Population of the city: ";
    cin >> city.pop;
    cout << "Area of the city: ";
    cin >> city.area;
    cout << "Year of foundation of the city: ";
    cin >> city.year;
    cout << "Number of schools in the city: ";
    cin >> city.schools;
    return 0;
}

int addStr(char path[]) {
    cities city;
    do {
        readStr(city);
        ofstream out((path), ios::app);
        out.write((char *) &city, sizeof(cities));
        out.close();
        cout << "If you wish to enter another entry, press 1.\n";
        cout << "Otherwise, press 0: ";
        cin >> city.area;
    }
    while (city.area);
    return 0;
}

Собственно вопрос - почему?
path - путь к файлу.
Сама структура:
struct cities {
public:
    char name[25];
    int pop;
    int area;
    int year;
    int schools;
};

Если тут всё нормально, и не должно выводить структуру два раза, так и напишите. Буду искать ошибки в вызове.
Отправлено: 22 Ноября 2011, 14:52
Разобрался. Тему можно закрывать/удалять


Название: Re: Вопрос по C++
Отправлено: CRP от 22 Ноябрь 2011, 21:59
ух ты же и давно же я С+- не видел то...


Название: Re: Вопрос по C++
Отправлено: K i r i L L от 25 Ноябрь 2011, 22:40
Код:
while (!in.eof()) {
    in.read((char *) &city, sizeof(cities));
    printRec(city);
}

бит in.eof() (признак конца файла) проставляется только после того как он "попытался прочитать и у него не получилось", в отличии от сишного аналога feof(FILE*) - этот ответит true сразу после того как будет прочитан последний байт файла.

Код:
while (!in.eof()) {
    in.read((char *) &city, sizeof(cities));
    if(!in.eof()){
        printRec(city);
    }
}

p.s. а почему для серриализации структуры в файл делается именно так? Имхо это плохо и наверняка загнётся на сложных типах данных =)
По мне так тут логичнее переопределить операторы чтения (>>) и записи(<<) из потока для данной структуры и волшебным образом читать её с помощью  in >> myCity;  и записывать  out << myCity;  :)


Название: Re: Вопрос по C++
Отправлено: DStandout от 26 Ноябрь 2011, 21:18
2K i r i L L: спасибо, я уже понял, что eof только после неудачной попытки срабатывает.

Ну а почему так записываются структуры - человеческая лень и категорическая нехватка времени в связи с относительной близостью сессии. Это же просто лаба. Ясно, что если бы я писал серьёзную программу, я бы переопределял операторы и ещё много чего бы изменил в остальной части программы, которая не вошла в моё сообщение.


Название: Re: Вопрос по C++
Отправлено: K i r i L L от 28 Ноябрь 2011, 01:16
=)