c - 具有 fgetc 功能的简单文件复制程序

标签 c

我制作了一个简单的程序,可以复制源文件并粘贴另一个定义的文件。

下面是我的代码。

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_sfopen)。并确保您传递了正确数量和/或类型的参数,这是一个体面的编译器应该警告您的事情。

关于c - 具有 fgetc 功能的简单文件复制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821308/

相关文章:

c - 所有输入的最小值——C

c - 如何在 Windows 上包含外部 C 库

c - 当指向它的指针作为参数传递给函数时如何填充结构

c - 分而治之算法的结果随机变为零

c - 如何在 C 编程中使用文件 IO 创建目录

C - 想要将 struct 类型的函数放在单独的 .c 文件中

c++ - 从 __int64 到 size_t 的安全转换

c - 动态调整作为双指针传入的数组的大小: double free detected

c - 如何同时删除数组中的多个元素

c - 错误[P​​e142] : expression must have pointer-to-object type