我制作了一个简单的程序,可以复制源文件并粘贴另一个定义的文件。
下面是我的代码。
int main(void) {
FILE *fp_src;
FILE *fp_dest;
char src[100];
char dest[100];
fputs("source file : ", stdout);
gets_s(src);
fp_src = fopen(src, "rb");
fputs("dest file : ", stdout);
gets_s(dest);
fp_dest = fopen(dest, "wb");
char ch;
//int ch;
while ((ch = fgetc(fp_src)) != EOF) {
fputc(ch, fp_dest);
}
fclose(fp_src);
fclose(fp_dest);
return 0;
}
当我使用 fgetc 函数时,它返回整数类型的值,因为 EOF 需要 4 个字节的空间。我知道这个概念,但是,我在编写这个程序时,错误地使用了字符类型来存储返回值。然后,我运行这个程序,目标文件(我想复制的文件)无法正确创建。 (文件大小为0字节)所以我把字符型改成了整数型,然后我发现它工作正常。
正如我上面提到的,我知道 fgetc 返回整数类型的值。但是,我认为对 fgetc 使用字符类型不是问题,但在使用 fgetc 函数复制文件时这是一个关键问题。
所以我不明白为什么会出现这种情况。
你能帮我更详细地了解一下吗?
最佳答案
需要使用类似 getchar
的函数才能返回每个可能的字符加上结束文件指示。
char
类型涵盖了“每个可能的字符”,但您必须使用更宽的类型来涵盖“PLUS”位。
换句话说,您的论点是“我不认为对 fgetc
使用字符类型不会(原文如此,假设您打算在此处键入“would”) 成为一个问题”是完全错误的。
fgetc()
的原型(prototype)非常清楚地说明:int fgetc ( FILE * stream );
并且那是你通常应该使用的对于返回值,int
。其他任何事情都是自找麻烦(不过,如果您了解隐式转换,您也可以使用更宽或更细的类型,但 int
可能是最佳选择)。
另外,您通常应该检查每次调用的返回值,如果失败会传播问题(例如 gets_s
或 fopen
)。并确保您传递了正确数量和/或类型的参数,这是一个体面的编译器应该警告您的事情。
关于c - 具有 fgetc 功能的简单文件复制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821308/