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

Почему последнюю строку из файла выводит дважды? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
rambayke
2 / 2 / 0
Регистрация: 31.07.2012
Сообщений: 71
13.08.2012, 08:05     Почему последнюю строку из файла выводит дважды? #1
привет всем!
скажите пожалуйста почему последнюю строку выводит 2 раза?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  FILE *f;
 
    if(!(f = fopen("keys.txt","r")))
        printf("Error access to keys.txt\n");
    else
    {
        char stroka[5];
 
        while(!feof(f))
        {
            fgets(stroka , 5 , f);
            printf("%s",stroka);
        }
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.08.2012, 08:27     Почему последнюю строку из файла выводит дважды? #2
Потому что неправильно составлена проверка на конец файла. Сначала прочитается и напечатается последняя строка, проверка условия while вернет истину, выполнится следующая итерация цикла, при которой наконец-то будет достигнут конец файла, а предыдущая строка будет напечатана без изменений.

Надо так:
C
1
2
3
4
5
6
7
8
while(fgets(stroka, 5, f) != NULL) /* fgets вернет NULL при конце файла или ошибке */
   printf("%s", stroka);
 
/* Как отличить конец файла от ошибки: */
if(ferror(f))
  /* обработка ошибки чтения */
else
  /* достигнут конец файла */
Непонятно правда, при чем здесь C++ и зачем называть переменные транслитом.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 08:30     Почему последнюю строку из файла выводит дважды? #3
Возможно, потому что у вас в файле всё аккуратно по 4 байта лежит. (Проблема у меня воспроизвелась.) Тогда при чтении последней строки fgets не доходит до EOF, а стоит прямиком перед ним. Только при следующей итерации он пытается считать очередные 4 байта из файла, обламывается, так как наконец доходит до EOF, не изменяет буфер, неизменный буфер ещё раз выводится на экран и наконец цикл заканчивается, так как флаг EOF был всё же установлен fgets.
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,292
Завершенные тесты: 1
13.08.2012, 08:31     Почему последнюю строку из файла выводит дважды? #4
Потому что в конце выводимого файла есть перевод строки, на нем fgets возвращает NULL и выводится повторно последняя строка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FILE *f;
 
    if(!(f = fopen("keys.txt","r")))
        printf("Error access to keys.txt\n");
    else
    {
        char stroka[5];
 
        while(!feof(f))
        {
            if(fgets(stroka , 5 , f))
            printf("%s",stroka);
        }
    }
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.08.2012, 08:37     Почему последнюю строку из файла выводит дважды? #5
alexcoder, ну не будет fgets возвращать на переводе строки NULL (если, конечно, не было ошибки чтения). Да и если бы это было так, то тогда feof вернул бы истину, и следующей итерации цикла бы не было.

Конец файла достигается именно на следующей попытке чтения файла.
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,292
Завершенные тесты: 1
13.08.2012, 08:46     Почему последнюю строку из файла выводит дважды? #6
http://www.cplusplus.com/reference/c.../cstdio/fgets/

Return Value
On success, the function returns the same str parameter.
If the End-of-File is encountered and no characters have been read, the contents of str remain unchanged and a null pointer is returned.

Как раз наш случай. Не прочитано ни одного байта, возвращается NULL, исходная строка не изменяется. Перевод строки был прочитан на предыдущем шаге цикла, feof в еще не "нащупал" конца файла.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.08.2012, 08:49     Почему последнюю строку из файла выводит дважды? #7
Цитата Сообщение от alexcoder Посмотреть сообщение
Как раз наш случай. Не прочитано ни одного байта, возвращается NULL, исходная строка не изменяется. Перевод строки был прочитан на предыдущем шаге цикла, feof в еще не "нащупал" конца файла.
с этим я не спорю, просто твоя предыдущая
реплика
Потому что в конце выводимого файла есть перевод строки, на нем fgets возвращает NULL
имеет, ИМХО, совсем другой смысл, даже если ты подразумевал иное.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 08:58     Почему последнюю строку из файла выводит дважды?
Еще ссылки по теме:

C++ Почему не выводит текст из файла (CP1251)?
Описать функцию PoslSu(t), которая выводит на печать последнюю строку непустого текстового файла C++
C++ Удалить последнюю строку из файла

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

Или воспользуйтесь поиском по форуму:
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,292
Завершенные тесты: 1
13.08.2012, 08:58     Почему последнюю строку из файла выводит дважды? #8
Просто пытался как попроще сказать
Yandex
Объявления
13.08.2012, 08:58     Почему последнюю строку из файла выводит дважды?
Ответ Создать тему
Опции темы

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