2014-10-06 2 views
2

Я пытаюсь прочитать этот .txt файл:fscanf и переключатель не работает

(1 2 (3 4 (5

с этим кодом:

#include <stdio.h> 

int main() { 
    FILE* f = fopen("teste.txt", "r"); 
    int i; 
    char j; 

    while (feof(f) == 0){ 
    fscanf(f, "%c", &j); 

    switch (j) { 

     case '(': 
     printf("%c ", j); 
     break; 

     default: 
     ungetc(j,f); 
     fscanf(f, "%d", &i); 
     printf("%d ", i); 
     break; 

    } 
    } 
    return 0; 
} 

Выходной сигнал:

(1 2 2 (3 4 4 (5 5

)

и должно быть:

(1 2 (3 4 (5

Что я делаю неправильно?

+2

Возможно хотите 'fscanf (п, "% С", &j);' -. Добавить пространства – chux

+1

Чтобы избежать (fcanf (f, "% c", & j) == 1) '. [Дополнительная информация] (http://stackoverflow.com/questions/5431941/while-feof-file-is -allways-wrong) –

+0

Также рассмотрите вопрос о проверке результата 'fscanf' в случае' default', в противном случае ваша программа будет разбита на столкновение строки с буквами в ней. –

ответ

1

1) Используйте int j;fgets() возвращает unsigned char или EOF 257 различных значений. Использование char теряет информацию.

2) Не используйте feof()

// while (feof(f) == 0){ 
// fscanf(f, "%c", &j); 
while (fscanf(f, " %c", &j) == 1) { // note space before %c 

3) Тест fscanf() возвращаемое значение

// fscanf(f, "%d", &i);  
if (fscanf(f, "%d", &i) != 1) break; 
0

использование fgetc вместо fscanf, попробуйте это

#include <stdio.h> 

int main() { 
FILE* f = fopen("teste.txt", "r"); 
int i; 
char j; 
char t; 
while (feof(f) == 0){ 

    j = fgetc(f); 

    switch (j){ 

    case '(': 
    printf("%c ", j); 
    break; 

    default: 
    ungetc(j,f); 
    t = fgetc(f); 
    i = atoi(&t); 
    printf("%d ", i); 
    break; 

    } 

} 
+1

1) Код имеет интересный бесконечный цикл. Рассмотрим, если 'j = fgetc (f);' приводит к 'j == EOF', а' char' - 'unsigned char'. Код продолжает возвращать 'char'. 2) 'i = atoi (&t);' UB. – chux

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