Задать вопрос
@TopToster

Ошибка при чтении из файла в си.Что делать?

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *in;
    int temp,sum=0;
    if ((in=fopen("input.txt","r"))==NULL){
        puts("ERROR");
        return 1;
    }
    while(!feof(in)){
        fscanf(in,"%i",&temp);
        printf("%i ",temp);
    }
    fclose(in);

    return 0;
}
выводит:
12 13 45 1 12 1 1

input.txt:
12 13 45 1 12 1
Подскажите почему дублируется последний символ?
  • Вопрос задан
  • 897 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Не надо использовать эту [beep] конструкцию while(!feof())
От нее только проблемы. Используйте fscanf() в цикле, пока он не вернет EOF.

Да, я знаю, что в примерах так - я сам когда-то писал по таким же примерам и потом долго матерился, не понимая, почему не работает...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
feof возвращает true, когда мы попытались прочитать и не смогли, потому что каретка ударилась в конец файла. А не когда каретка аккуратно припарковалась в конце файла — и уж тем более не когда она отделена от конца пробелами.

Лучше прочитайте про scanf…
On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.

…и посмотрите, как можно переделать условие цикла.
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
1. Стоит проверять что возвращает функция чтения fscanf.
Она явно не смогла прочитать число из потока.
У тебя в файле после последней единицы что-то есть типа возврата строки, пробела или чего-то подобного.

2. Уже к чистоте кода держите переменные ближе к месту использования. temp сразу перед fscanf и ещё и чем нибудь инициализировать. Тогда как минимум в подобных случаях будет не последнее значение, а "маркер"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы