2017-01-08 3 views
4

Я только начал изучать обработку файлов на C и задался вопросом, могу ли я выполнять математические вычисления, читая ввод из файла, вот код для простого чтения символов и отображения на консоль:Невозможно понять - чтение символов из файлов в C

int main(void) 
{ 
    FILE *p; 
    char a, b, c, ch; 

    p = fopen("numbers.txt", "a+"); 

    while((ch = getc(p)) != EOF) 
    { 
     fscanf(p, "%c %c %c\n", &a, &b, &c); 
     printf("%c %c %c\n", a, b, c); 
    } 
    fclose(p); 

    return 0; 
} 

numbers.txt содержит (с пробелом перед каждым символа):

2 + 3 
5 + 6 
6 + 7 

получен выход:

2 + 3 
    + 6 
    + 7 

Я не могу понять, почему вывод первой строки такой же, как ожидалось, но вторая и третья строки имеют отсутствующий символ, хотя новая строка дается после каждого выражения в numbers.txt.

+2

Пожалуйста, проверьте возвращаемое значение 'fopen'. –

+3

1) '' a + "' -> '' r "' 2) 'while ((ch = getc (p))! = EOF) { fscanf (p,"% c% c% c \ n " , & a, & b, &c); '->' while (fscanf (p, "% c% c% c \ n", & a, & b, & c) == 3) {' – BLUEPIXY

+1

Также проверьте возвращаемое значение из' fscanf' –

ответ

6

Дополнительный символ сканируются в начале каждой итерации цикла вашего while

while((ch = getc(p)) != EOF) 

Попробуйте делаете fscanf() заявления в качестве условия для while цикла и проверить возвращаемое значение. По cplusplus.com:

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

Если ошибка чтения происходит или конец файла-достигается в то время как чтение, правильный индикатор установлен (feof или FERROR). И если либо происходит до того, как любые данные могут быть успешно прочитаны, возвращается EOF.

Так попробуйте изменить условия пока к любому из следующих действий:

while (fscanf(p, " %c %c %c", &a, &b, &c) != EOF) 

или

while (fscanf(p, " %c %c %c", &a, &b, &c) == 3) 
6

Использование пробелов в формате scanf спецификатора, как вы делаете с \n, спички любой сумма пробелов. \n и ведущее место на следующей линии расходуются, в результате чего getc удаляет первую цифру вместо ведущего.

Я бы пропустить getc целиком, как это было предложено @BLUEPIXY:

while (fscanf(p, " %c %c %c", &a, &b, &c) == 3) { 
    printf("%c %c %c\n", a, b, c); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^