EOF 前的 '\n' 个字符

'\n' characters before EOF

char ch;
int n = 0;
FILE* fp;

fp = fopen("test.txt", "r");
while(!feof(fp)){
    n++;
    fscanf(fp, "%c", &ch);
    fprintf("%c", ch);
}
printf("%d\n", n);

test.txt低于

abcd

我试图通过打印出整数 n 来计算这个 while 循环执行了多少次。我以为结果会是 4,因为 fp 只包含 4 个字符,"abcd"。但实际结果是6。在EOF之前有两个换行符是ascii码10。

我仔细检查了 test.txt 文件,它不包含除 abcd 之外的其他字符。这两个换行符是从哪里来的?我使用了 vim 编辑器。

首先,当 getc 可以时,不要使用 scanf。其次,停止使用 feof 就好像它是魔术一样。 (Why is “while ( !feof (file) )” always wrong?)。第三,"abcd\n" 是 5 个字符,您对 feof 的误用导致您重复使用最后的换行符并多算一个。