Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐行读取文件,分析字符--C_C_File_Line - Fatal编程技术网

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

逐行读取文件,分析字符--C,c,file,line,C,File,Line,我试图一次读取一行文件,打印出该行,然后分析每个字符以确定如何处理它(所有分析都在驱动程序中进行,如果字符不是字母或数字,则将其标记为错误) 我当前的输入文件是: Hello$ is asd 这就是我一次读一行的方法: char GetSourceChar() { char line[MAXLINE]; if (changeLine == 1) { if (fgets(line, sizeof line, file) != NULL) { char str1[10]

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

我当前的输入文件是:

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,因此此后似乎没有任何操作正常


有什么想法吗?

行数组在本地声明为
GetSourceChar()
,因此在调用之间超出范围。因此,在函数返回后,它的内容可能(也可能不会)被覆盖,并且在下次调用函数时,它可能(也可能不会)包含意外值

您可以通过以下方式解决此问题:

  • 在函数中声明它是静态的,或者
  • 在调用函数中声明并将其作为参数传递,或
  • 在全球范围内声明它
此外,您可以替换所有这些

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


MAXLINE有多大?我假设它是一个define,但是它的值是什么?你在哪里定义col,它有什么值?我将col定义为一个全局int,最初等于0I。我想,大多数问题都来自无形的副作用。尝试将参数用于此函数。我猜你多次调用这个函数?在某一时刻,fgets()将返回NULL,但您继续使用缓冲区的内容,这在当时可能是未定义的。好的,这似乎部分修复了它,但现在我意识到如果我的输入是这样的,则会出现问题…'您好$asd$,然后进入asd$之后的下一行…它在这个实例中无法工作感谢所有人的帮助,我想我已经解决了<代码>如果(fgets(line,sizeof line,file)!=NULL)当我到达文件的最后一行时,它会识别它为NULL,但它不会删除该行上的内容。所以它实际上仍然在反复阅读那一行中的字符,形成一个无限循环。我修复了这个问题,检查它何时为null,并且只读取字符而不读取null。似乎有用!
printf("[%d] %s", row, line);
fprintf(outFile, "[%d] %s", row, line);