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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конец Файла. feof(), EOF - не понятки 
:(
    Опции темы
ressac
Дата 10.4.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



привет, не могу понять как работает feof()

вот пример:

Код



    fread(&aux_alumno,sizeof(alumnos_struct),1,file); //считываю структуру из одного файла

    while(!feof(file)) //проверяю не конец-ли

        if(flag || 0<strcmp(alumno->dni,aux_alumno.dni)) //сравниваю один из элементов структуры
        {

            fwrite(&aux_alumno,sizeof(alumnos_struct),1,aux_file);
            fread(&aux_alumno,sizeof(alumnos_struct),1,file);

        }
        else
        {

            flag=1;
            fwrite(alumno,sizeof(alumnos_struct),1,aux_file);

        }


вообщем вопрос в том почему когда в файл записана лишь одна запись структуры на в входе в while(!feof(file)) программа проходит спокойно, и остается там до тех пор пока ещё раз не прочитаем fread(), но что самое интересно когда я смотрю с помощью ftell() позицию внутри файла то она одинакова до того чтения что происходит внутри while.

тойсть например структура весит всего 60 байт, мы считываем эти 60 байт за один раз и по идее файл закончился, но это не так, надо считать ещё раз, только вот что читать из фала если он закончился?

вообще ничего не понимаю smile


PM MAIL   Вверх
Partizan
Дата 10.4.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



читаем MSDN

Цитата

The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file


теперь надеюсь всё понятно?

если нет. вот мой вольный перевод:

функция эта возвращает ненулевое значение после первой операции чтения, которая патыется прочесть данные после конца файла...

то бишь если у вас в примере будет
Код

    fread(&aux_alumno,sizeof(alumnos_struct)+1,1,file); //считываю структуру из одного файла

    while(!feof(file)) //проверяю не конец-ли

    //....

        }

а в файл будет записана одна структура длиной в 60 байт..
то в цикл программа не войдёт

Это сообщение отредактировал(а) Partizan - 11.4.2007, 00:01


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
nickless
Дата 11.4.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



Насколько я понимаю логику работы feof(), функция эта просто позволяет узнать, не наткнулись ли мы на конец файла.
При чтении из файла все соответствующие функции работают как-бы в слепую, т.к. размер файла не известен, т.е. даже если прочитать весь файл ровно до конца и остановиться на последнем байте, конца файла всё равно еще не видно. То, что файл кончился можно узнать только попытавшись продвинутся за его пределы и получив ошибку в ответ, и только после этого feof() вернёт true.
Всё вышесказанное - моё личное имхо, я вроде бы как-то давно читал про это, но не помню где, так что ссылку дать не могу  smile 

edit
Partizan, точно, вот именно так там и было написано

Это сообщение отредактировал(а) nickless - 11.4.2007, 00:20


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0549 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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