c - C中不同输出内容的文件复制

标签 c file-copying fgetc getc

你好,我有一个简单的 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);
}

确实是:

  1. 检查 EOF
  2. 读取一个字符,可能导致 EOF
  3. 输出刚刚读取的字符,不检查 EOF。

当EOF发生时,(3)仍然在下一次迭代中 checkin (1)之前执行。特殊值 EOF 被转换为 char 并输出。

正确的循环是

while ((ch = fgetc(src)) != EOF)
    fputc(ch, dst);

假设您将 ch 指定为 int 类型,因为 char 无法表示 EOF.注意检查中的分配;有些程序员会告诉你这很丑陋,但是很多人都在使用它,所以你最好还是习惯它。您的变体 for 循环也是正确的。

(旁白 1:fputc 相当于 putcfgetc 相当于 getc,只要您不这样做不要尝试在函数指针上下文中使用它们。)

(旁白 2:您的 while 循环也不检查流错误,而检查 EOF 返回也会捕获该错误。 )

关于c - C中不同输出内容的文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857963/

相关文章:

c - 将十六进制从 .txt 转换为 C 中的数组/字符串

c - 我如何读取 C 中的数字?

c# - 在 C# 中的快捷方式后面复制文件

python - 将文件移动到子目录时出现 os.rename 路径错误

c - 如何将 "an expression with side effects"传递给 getc?

c - 如何在C中读取目标文件?

c - 通过删除 printf 语句得到不同的答案

r - 在文件夹之间移动文件

c - fgetc() 无法正常工作

c# - 多线程:运行 C dll 的 C# 程序 - 无响应的 C#