Чтение файла построчно, анализ символов --- C - PullRequest
2 голосов
/ 01 марта 2012

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

Мой текущий входной файл:

Hello$ is
asd

Так вот, что я делаю, чтобы читать по одной строке за раз:

char GetSourceChar() {
  char line[MAXLINE];
  if (changeLine == 1) {
    if (fgets(line, sizeof line, file) != NULL) {
      char str1[10];
      sprintf(str1,"%d", row); // convert int to 'string'
      printf("[");
      printf(str1);
      printf("] ");
      fprintf(outFile, "%s", "[");
      fprintf(outFile, "%s", str1);
      fprintf(outFile, "%s", "] ");
      printf("%s", line);
      fprintf(outFile, "%s", line);
      changeLine = 0;
    }
  }     
  char c = line[col];
  if (c == '\r'){
    changeLine = 1;
    row++;
    col = 0;
  }
  col++;
  return c;
}

И вот мой вывод:

[0] hello$ hi
         ^
         Incorrect Character
[1] asd

Это именно то, что я хочу, чтобы он выглядел, но если я изменю свой входной файл на хотя бы одно слово дольше, он не будет работать?Я замечаю, что ошибка возникает, когда я говорю

char c = line[col]

Она не возвращает правильный символ, только \ 000, поэтому после этого ничего не работает правильно.

Есть мысли?

1 Ответ

1 голос
/ 01 марта 2012

Массив line объявлен локально в GetSourceChar() и, следовательно, выходит из области видимости между вызовами. Поэтому его содержимое может (или не может) быть перезаписано после возврата из функции, и может (или не может) содержать неожиданные значения при следующем вызове функции.

Вы можете исправить это:

  • объявив его static в функции или
  • объявив его в вызывающей функции и передав его в качестве параметра, или
  • объявляя это глобально.

Также вы можете заменить все это

char str1[10];
sprintf(str1,"%d", row); // convert int to 'string'
printf("[");
printf(str1);
printf("] ");
fprintf(outFile, "%s", "[");
fprintf(outFile, "%s", str1);
fprintf(outFile, "%s", "] ");
printf("%s", line);
fprintf(outFile, "%s", line);

с

printf("[%d] %s", row, line);
fprintf(outFile, "[%d] %s", row, line);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...