Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Cocozub
2 / 2 / 0
Регистрация: 09.10.2013
Сообщений: 104
Завершенные тесты: 1
#1

C++ конец файла - C++

23.10.2013, 17:06. Просмотров 254. Ответов 6
Метки нет (Все метки)

Имеется файл с данными типа forestry и функция которая выводит на экран его содержимое
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void output_all (void)
{
    forestry temp;
    FILE *f;
    if((f = fopen ("forestry.txt", "rb")) == NULL)
        exit(1);
    while (!feof (f))
    {   
        int result = fread (&temp, sizeof ( forestry), 1, f);
        out (temp, f);
    } 
    fclose (f);
}
Почему цикл выполняется на 1 раз больше чем должен и последний элемент выводится дважды ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 17:08     C++ конец файла #2
C++
1
2
3
4
5
6
while (1)
{   
     int result = fread (&temp, sizeof ( forestry), 1, f);
     if (feof (f)) break;
     out (temp, f);
}
Cocozub
2 / 2 / 0
Регистрация: 09.10.2013
Сообщений: 104
Завершенные тесты: 1
23.10.2013, 17:19  [ТС]     C++ конец файла #3
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
5
6
while (1)
{   
     int result = fread (&temp, sizeof ( forestry), 1, f);
     if (feof (f)) break;
     out (temp, f);
}
Для чего здесь переменная result ? Можете пояснить ваш вариант и почему не работает мой ?
gazlan
Нарушитель
3129 / 1904 / 285
Регистрация: 27.08.2010
Сообщений: 5,133
Записей в блоге: 1
23.10.2013, 17:21     C++ конец файла #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void output_all()
{
   forestry    temp;
   
   FILE*    f = fopen("forestry.txt","rb");
   
   if (!f)
   {  
      exit(1);
   }
 
   while (fread(&temp,1,sizeof(forestry),f) == sizeof(forestry))
   {     
      out(temp);
   } 
 
   fclose (f);
}
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 17:37     C++ конец файла #5
Цитата Сообщение от Cocozub Посмотреть сообщение
Для чего здесь переменная result ?
Понятия не имею. fread() возвращает количество считанных символов.

Добавлено через 2 минуты
Цитата Сообщение от Cocozub Посмотреть сообщение
и почему не работает мой ?
В последней итерации цикла будет считан конец файла, в temp ничего не запишется, т.е., останется старое значение, которое и будет выведено во второй раз.
Cocozub
2 / 2 / 0
Регистрация: 09.10.2013
Сообщений: 104
Завершенные тесты: 1
23.10.2013, 17:38  [ТС]     C++ конец файла #6
Ясно, большое спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 17:56     C++ конец файла
Еще ссылки по теме:

C++ Записать в конец файла
C++ Конец файла
C++ Запись в конец файла
C++ Зацикливание и конец файла
C++ Конец файла EOF

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5410 / 4806 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 17:56     C++ конец файла #7
Тут даже лучше так написать:
C++
1
2
3
4
5
6
while (1)
{   
     int result = fread (&temp, sizeof ( forestry), 1, f);
     if (!result) break;
     out (temp, f);
}
Вывод будет, если только считан целый объект.
Yandex
Объявления
23.10.2013, 17:56     C++ конец файла
Ответ Создать тему
Опции темы

Текущее время: 11:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru