Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Повторное чтение файла


Автор: Pakshin A. S. 22.4.2006, 09:33
Пишу прогу в Microsoft Visual C++ 6.0

Сначала выполняется вот эта функция:
Код

void CDataFile::AddData(SFileElement buf)
{
    ofstream output(Base, ios::out | ios::binary);
    output.write((char *) &buf, sizeof(SFileElement));
    output.close();
    Stack.push(buf);
}

Она записывает в файл структуру и добавляет ее в стек.

Закрываю программу.

Запускаю программу.

Выполняется конструктор класса:
Код

CDataFile::CDataFile()
{
    ifstream input(Base, ios::in | ios::binary);
    SFileElement buf;
    while (!input.eof())
    {
        input.read((char *) &buf, sizeof(SFileElement));
        Stack.push(buf);
    }
    input.close();
}

Он должен прочитать файл и добавить все структуры из него в стек.

Так вот: файл читается два раза! Писал в него один раз, а получил содержание в нем как бы двух записей. Кстати, вторая читатся корректно, а именно она схожа с первой, т. е. файл как бы второй раз заново читается. 

В чем причина этого? Как избавиться от ошибки, не прибегая к просмотру стека для поиска повторений... 

Автор: Pakshin A. S. 22.4.2006, 10:58
P. S.
Кстати по поводу сохранения в файл... вот тут оказывается что он все время перезаписывается (что есть логично), поэтому как при такой организации работы с файлом можно добавитсья запись в конец файла...  smile

Добавлено @ 11:03 
С добавлением понял... smile

Выяснилось, что два раза читается последняя запись в файле...  smile  

Автор: Pakshin A. S. 22.4.2006, 11:24
Заработало корректно:
Код

    while (!input.eof())
    {
        input.read((char *) &buf, sizeof(SFileElement));
        if (!input.eof())
            Stack.push(buf);
    }


Интересно однако... я привык к вот такой логике:
Код

пока не конец файла
   прочитать данные из файла
   поместить данные в стек

а тут:
Код

пока не конец файла
   прочитать данные из файл
   если не конец файла
      поместить данные в стек


Это нормально? 

Автор: Exekutor 22.4.2006, 11:28
да, ведь конец файла может наступить внутри цикла, до проверки условия 

Автор: Earnest 23.4.2006, 19:49
Pakshin A. S., состояние "конец файла" устанавливается только если программа пытается читать за его концом, не раньше. Т.е. первый вызов
input.read((char *) &buf, sizeof(SFileElement)); отрабатывает нормально, но не устанавливает eof, хотя дальше уже ничего нет.
Когда ты вызываешь input.read второй раз - он уже ничего не читает, но и не перезаписывает твой буфер. Поэтому лучше проверять, сколько возвратил read:
if (input.read((char *) &buf, sizeof(SFileElement))) ... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)