Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повторное чтение файла 
V
    Опции темы
Pakshin A. S.
  Дата 22.4.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Пишу прогу в 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();
}

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

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

В чем причина этого? Как избавиться от ошибки, не прибегая к просмотру стека для поиска повторений... 
PM   Вверх
Pakshin A. S.
Дата 22.4.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



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

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

Выяснилось, что два раза читается последняя запись в файле...  smile  
PM   Вверх
Pakshin A. S.
Дата 22.4.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Заработало корректно:
Код

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


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

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

а тут:
Код

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


Это нормально? 
PM   Вверх
Exekutor
Дата 22.4.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: 1
Всего: 4



да, ведь конец файла может наступить внутри цикла, до проверки условия 

Это сообщение отредактировал(а) Exekutor - 22.4.2006, 11:30


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
Earnest
Дата 23.4.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.