问为什么简单的逐行复制循环while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); }会复制最后一行两次?
答在 C 语言中,文件结束(end-of-file)仅在输入函数尝试读取但失败之后才会被指示。(换句话说,C 的 I/O 与 Pascal 的不同。)通常,您只需检查输入函数的返回值即可。
while(fgets(buf, MAXLINE, infp) != NULL) fputs(buf, outfp);几乎在所有情况下,都没有必要使用feof。(feof,或者更可能的是ferror,在 stdio 调用返回EOF或NULL后,用于区分文件结束条件和读取错误。)
参考文献:K&R2 Sec. 7.6 p. 164
ISO Sec. 7.9.3, Sec. 7.9.7.1, Sec. 7.9.10.2
H&S Sec. 15.14 p. 382