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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
rambayke
2 / 2 / 0
Регистрация: 31.07.2012
Сообщений: 71
#1

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

13.08.2012, 08:05. Просмотров 1642. Ответов 7
Метки нет (Все метки)

привет всем!
скажите пожалуйста почему последнюю строку выводит 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);
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 08:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему последнюю строку из файла выводит дважды? (C++):

Почему считывает последнюю строчку дважды? - C++
Почему считывает последнюю строчку дважды? #include<iostream> #include<cstdio> #include<cstring> #define EOF -1 using namespace...

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

Почему выводит только последнюю строчку? - C++
завтра на зачет нужно!!!!!! есть код. /*1. Задан текстовый файл Input.txt, состоящий из слов и некоторое предложение. ...

Считать последнюю строку файла - C++
Доброго времени суток! есть файл который имеет структуру(ниже), надо считать данные. До последней строки получается. Как быть с последней...

Удалить последнюю строку из файла - C++
Дан непустой текстовый файл. Удалить из него последнюю строку.

Вывести последнюю строку из файла - C++
Здравствуйте, пишу на этом форуме впервые. Я недавно начал изучать С++, по-этому знаний мало, может-ли кто-нибудь объяснить, как вывести...

7
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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++ и зачем называть переменные транслитом.
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 08:30 #3
Возможно, потому что у вас в файле всё аккуратно по 4 байта лежит. (Проблема у меня воспроизвелась.) Тогда при чтении последней строки fgets не доходит до EOF, а стоит прямиком перед ним. Только при следующей итерации он пытается считать очередные 4 байта из файла, обламывается, так как наконец доходит до EOF, не изменяет буфер, неизменный буфер ещё раз выводится на экран и наконец цикл заканчивается, так как флаг EOF был всё же установлен fgets.
1
alexcoder
1465 / 679 / 89
Регистрация: 03.06.2009
Сообщений: 3,589
Завершенные тесты: 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);
        }
    }
1
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.08.2012, 08:37 #5
alexcoder, ну не будет fgets возвращать на переводе строки NULL (если, конечно, не было ошибки чтения). Да и если бы это было так, то тогда feof вернул бы истину, и следующей итерации цикла бы не было.

Конец файла достигается именно на следующей попытке чтения файла.
0
alexcoder
1465 / 679 / 89
Регистрация: 03.06.2009
Сообщений: 3,589
Завершенные тесты: 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 в еще не "нащупал" конца файла.
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.08.2012, 08:49 #7
Цитата Сообщение от alexcoder Посмотреть сообщение
Как раз наш случай. Не прочитано ни одного байта, возвращается NULL, исходная строка не изменяется. Перевод строки был прочитан на предыдущем шаге цикла, feof в еще не "нащупал" конца файла.
с этим я не спорю, просто твоя предыдущая
реплика
Потому что в конце выводимого файла есть перевод строки, на нем fgets возвращает NULL
имеет, ИМХО, совсем другой смысл, даже если ты подразумевал иное.
0
alexcoder
1465 / 679 / 89
Регистрация: 03.06.2009
Сообщений: 3,589
Завершенные тесты: 1
13.08.2012, 08:58 #8
Просто пытался как попроще сказать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 08:58
Привет! Вот еще темы с ответами:

Массив: Почему выводит все в строку? - C++
Почему выводит все в строку? #include <iostream> #include <stdio.h> using namespace std; #define N 2 #define M 3 int A,...

Почему putchar() выводит всю строку? - C++
У К&Р есть такой пример: #include <stdio.h> ...

Почему выводит еще одну строку, равную 0? - C++
2. Дана целочисленная квадратная матрица. Определить: • сумму элементов в тех столбцах, которые не содержат отрицательных элементов; ...

Объяснить почему указатель выводит всю строку сразу, а не адрес первого элемента - C++
Всем привет :) Начал изучать сей замечательный язык и появились кое-какие вопросы к гуру! Запутался в указателях... ...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
13.08.2012, 08:58
Ответ Создать тему
Опции темы

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