c - 如何在c中复制二进制文件

标签 c file binary

大家好,我正在尝试制作一个程序,将二进制文件(值)从源复制到目标。但我有一个错误,我不知道如何解决这个问题,我该如何完成代码?

int main(int argc, char ** argv)
{
    FILE * source, *target;
    int numr, numw;
    char buffer[100];


    source = fopen(argv[1], "rb");
    target = fopen(argv[2], "rb");
    if ((source = fopen(argv[1], "rb")) == NULL)
    {
        printf("open read file error.\n");
        return 0;
    }

    while (feof(source) == 0)
    {
        if ((numr = fread(buffer, 1, 100, source)) != 100)
        {
            if (ferror(target) != 0)
            {
                printf("read file error.\n");
                return 0;
            }
        }
        fwrite(buffer, 1, numr, target);
        if ((numw = fwrite(buffer, 1, numr, target)) != numr)
        {
            printf("write file error.\n");
            return 0;
        }
    }

    fclose(source);
    fclose(target);

    return 0;
}

最佳答案

首先,您不会两次打开源文件。只需从代码中删除第一个或第二个 fopen 即可。

    source = fopen(argv[1], "rb");
    if (source == NULL)
    {
        printf("open read file error.\n");
        return 0;
    }

还必须使用“w”打开目标文件并检查其是否成功。

    target = fopen(argv[2], "a+w");
    if (target == NULL)
    {
        fclose(source);
        printf("open target file error.\n");
        return 0;
    }

而且你不需要检查 fread 是否返回 100,如果有问题,ferror() 会为你检测错误。

        numr = fread(buffer, 1, 100, source);
        if (ferror(target) != 0)
        {
            printf("read file error.\n");
            break;
        }

此外,您必须使用一次写入功能

        numw = fwrite(buffer, sizeof(char), numr, target);
        if (numw != numr)
        {
            printf("write file error.\n");
            break;
        }

我编辑了你的代码,现在它工作正常......

int main(int argc, char ** argv)
{
    FILE *source, *target;
    int numr, numw;
    char buffer[101];

    source = fopen(argv[1], "rb");
    if (source == NULL)
    {
        printf("open read file error.\n");
        return 0;
    }

    target = fopen(argv[2], "a+w");
    if (target == NULL)
    {
        fclose(source);
        printf("open target file error.\n");
        return 0;
    }

    while (feof(source) == 0)
    {
        memset(buffer, 0, sizeof(buffer));
        numr = fread(buffer, 1, 100, source);
        if (ferror(target) != 0)
        {
            printf("read file error.\n");
            break;
        }

        numw = fwrite(buffer, sizeof(char), numr, target);
        if (numw != numr)
        {
            printf("write file error.\n");
            break;
        }
    }

    fclose(source);
    fclose(target);

    return 0;
}

关于c - 如何在c中复制二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080537/

相关文章:

c# - 在没有存储过程的情况下从 C# 将二进制数据插入 SQL

c - 用文本替换占位符 - C?

java - 如何在内存中创建目录?伪文件系统/虚拟目录

c++ - 逐行读取文件并解析为 vector C++ 中的大量整数

python - 语法错误 : unexpected character after line continuation character in python

Php Apache2 插入大型二进制 MSSQL 错误 : Changed database context to 'database'

java - 为什么我的代码没有返回连续 "maximum"524275"的 1's for the specific input "个数字?

c - 带有 switch 语句的交互式菜单

c - Valgrind C 中链表的大小 4 读取无效

c++ - 优化 SphereInFrustrum 检查