逐行读取文件,分析字符--- C.

时间:2012-03-01 02:40:25

标签: c file line

我正在尝试一次读取一行文件,打印出该行,然后分析每个字符以确定如何处理它(所有分析都在驱动程序中进行,如果是,则将其标记为错误字符是除字母或数字之外的任何字符)

我当前的输入文件是:

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 个答案:

答案 0 :(得分:1)

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);