C在文件末尾检测最后一行新行

C在文件末尾检测最后一行新行,c,file,fgetc,C,File,Fgetc,如果新行在前一行上有文本,我就无法在文件结尾之前检测到新行 我能检测到新的4号线 1 some text 2 some text 3 4 但不包括具有此类型文件的新行3 1 some text 2 some text 3 (数字(1,2,3,4)是行,它们不在文件中) 这是我的示例代码:(编辑:代码用更相关的变量更新) #包括 #包括 main() { 文件*fp; int-ch; int i=0; 内线=1; int列=0; int-tmp=0; fp=fopen(“input.t

如果新行在前一行上有文本,我就无法在文件结尾之前检测到新行

我能检测到新的4号线

1  some text
2  some text
3
4
但不包括具有此类型文件的新行3

1  some text
2  some text
3
(数字(1,2,3,4)是行,它们不在文件中)

这是我的示例代码:(编辑:代码用更相关的变量更新)

#包括
#包括
main()
{
文件*fp;
int-ch;
int i=0;
内线=1;
int列=0;
int-tmp=0;
fp=fopen(“input.txt”,“r”);
如果(fp!=NULL){
而((ch=fgetc(fp))!=EOF){
开关(ch){
案例“\n”:
如果(i==0){
列=tmp;
}
if(tmp!=列){
printf(“错误\n”);
}
tmp=0;
line++;
i++;
打破
违约:
tmp++;
打破
}
}
fclose(fp);
}
}

我不明白为什么在第二种情况下没有输出“error”。

您的代码在第一个换行之前计算文件中的字符数,并将其存储为
n
。每次后续读取换行符时,它都会检查从上一个换行符开始读取的字符数是否与第一行的字符数相同(
n
),如果不相同,则会打印错误消息(这似乎有点奇怪)


您是否考虑过换行符在输入中的位置,以及“行”的确切定义?我想你会发现四行文字中有三个换行,三行文字中有两个换行。也就是说,编辑器呈现给您的作为文件最后一行的内容本身并不是以换行符结尾的。

我认为通过理解换行符是什么,您将理解错误所在 让我们在显示换行符时查看文件的内容 第一个文件实际上是这样的

1  some text\n
2  some text\n
3  \n
4  empty
1  some text\n
2  some text\n
3  \n
4  \n
1  some text\n
2  some text\n
3  empty
不是这样的

1  some text\n
2  some text\n
3  \n
4  empty
1  some text\n
2  some text\n
3  \n
4  \n
1  some text\n
2  some text\n
3  empty
第二个是这样的

1  some text\n
2  some text\n
3  \n
4  empty
1  some text\n
2  some text\n
3  \n
4  \n
1  some text\n
2  some text\n
3  empty

fgetc()返回一个“int”而不是“char”。3行大小写是以
\n
结尾还是以另一个字符结尾?文件结尾后没有“新行”。文件的结尾就是:文件的结尾。从我所看到的一切来看,你的代码显然是在试图检测一个没有中间内容的双换行符,它在三行版本中不存在,在四行版本中也存在。非常糟糕的变量名
I
m
n
tmp
,你甚至没有使用
buff
。这不是有趣的阅读。这个问题很愚蠢。。。你能关上它吗?