fscanf и переключатель не работают

Я пытаюсь прочитать этот файл.txt:

(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 ответа

Решение

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;

Использование 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;

    }

}
Другие вопросы по тегам