你好,我有一个简单的 C 语言复制文件程序,但我无法解释为什么当我使用第二种方法时我在目标文件中得到不同的输出。 for循环的正确输出:
I am the worst programmer in the world!
:D
And this is bla bla bla bla
more bla bla bla...
但是使用 while 循环会在 EOF 中生成随机字符:
I am the worst programmer in the world!
:D
And this is bla bla bla bla
more bla bla bla...
代码是
int main()
{
int i;
char ch;
create_files();
FILE *src = fopen("best.txt", "r");
FILE *dst = fopen("copied.txt", "w");
for(i=getc(src); i!=EOF; i=getc(src)) //correct copy
{
putc(i, dst);
}
/* while(!feof(src)) //woot?
{
ch=fgetc(src);
fputc(ch,dst);
}*/
fclose(dst);
fclose(src);
return 0;
}
void create_files()
{
FILE *fp;
fp = fopen("best.txt","w");
fprintf(fp,"I am the worst programmer in the world!\n:D\n And this is bla bla bla bla\n more bla bla bla...\n");
fclose(fp);
}
我已经使用了 fputc 或 putc 和 fgetc 或 getc,但仍然相同。我是不是忘记了什么?
最佳答案
什么
while (!feof(src)) {
ch=fgetc(src);
fputc(ch,dst);
}
确实是:
- 检查 EOF
- 读取一个字符,可能导致 EOF
- 输出刚刚读取的字符,不检查 EOF。
当EOF发生时,(3)仍然在下一次迭代中 checkin (1)之前执行。特殊值 EOF
被转换为 char
并输出。
正确的循环是
while ((ch = fgetc(src)) != EOF)
fputc(ch, dst);
假设您将 ch
指定为 int
类型,因为 char
无法表示 EOF
.注意检查中的分配;有些程序员会告诉你这很丑陋,但是很多人都在使用它,所以你最好还是习惯它。您的变体 for
循环也是正确的。
(旁白 1:fputc
相当于 putc
,fgetc
相当于 getc
,只要您不这样做不要尝试在函数指针上下文中使用它们。)
(旁白 2:您的 while
循环也不检查流错误,而检查 EOF
返回也会捕获该错误。 )
关于c - C中不同输出内容的文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857963/