逐行读取文件,分析字符--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);