Форум портала Metropolis Галерея   
Добро пожаловать. Пожалуйста, войдите или зарегистрируйтесь.
31 Январь 2025, 01:05 *

Форум Metropolis в мобильном формате [подробнее]
 
   Начало   Помощь Поиск Правила Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по C++  (Прочитано 2968 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DStandout
Активный пользователь
***

Репутация: 18
Сообщений: 160


Email
: 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
Разобрался. Тему можно закрывать/удалять

If you can't learn to do something well, learn to enjoy doing it poorly.
CRP
Житель форума
*****

Репутация: 72
Сообщений: 1065


Googlusclan

Ответ #1 : 22 Ноябрь 2011, 21:59

ух ты же и давно же я С+- не видел то...



UNIX for stability, Palm for portability, Mac for productivity, and Windows for solitaire!
ох, чую влепят мне RO.
K i r i L L
*

Репутация: 166
Сообщений: 713

Мир изменится..

Ответ #2 : 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;  Улыбается
« Последнее редактирование: 25 Ноябрь 2011, 23:23 от K i r i L L »

キリル =)
DStandout
Активный пользователь
***

Репутация: 18
Сообщений: 160


Email
Ответ #3 : 26 Ноябрь 2011, 21:18

2K i r i L L: спасибо, я уже понял, что eof только после неудачной попытки срабатывает.

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

If you can't learn to do something well, learn to enjoy doing it poorly.
K i r i L L
*

Репутация: 166
Сообщений: 713

Мир изменится..

Ответ #4 : 28 Ноябрь 2011, 01:16

=)

キリル =)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines
Text only version | PDA version