复制二进制文件 - c编程中的源和目标

时间:2016-05-06 22:50:42

标签: c file binary argv argc

你好我们制作了一个复制二进制文件的程序,但我有一个问题:当我试图将源文件的字段复制到目标文件时,它会删除目标文件的所有字段。我怎么解决这个问题?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int  main(int argc, char** argv)
{
    FILE  *source, *target;
    const size_t buffer_size = 8192;
    char buffer[100];
    int strint[100];
    int  a;

    source = fopen(argv[1], "rb");


    if (source != NULL)
    {
        return  -1;
    }

    target = fopen(argv[2], "w+b");

    while (1)
    {
        a = fread(buffer, sizeof(char), buffer_size, source);

        if (!feof(source))
        {
            fwrite(buffer, sizeof(char), buffer_size, target);
        }
        else
        {
            break;
        }

    }

    fclose(target);
    fclose(source);
    system("pause");
    return 0;

}

3 个答案:

答案 0 :(得分:1)

  1. 您声明buffer_size为8192,但您只分配100个字符而不是buffer_size。所以改变声明。此外,常量通常是全部大写。

  2. 您需要将a个字节写入目标文件,而不是buffer_size,因为该文件甚至可能不是buffer_size个字符!

  3. 检查fopen的返回值;失败时返回NULL。查看strerror以打印错误原因。

  4. 你的循环错了。只需循环fread返回BUFSIZE(即fread读取BUFSIZE字符)。

  5. 永远不要使用system,因为它非常难以移植。

  6. 修订后的计划

    FILE *Fopen(const char *filename, const char *mode)
    {
        FILE *fp;
    
        if ((fp = fopen(filename, mode)) == NULL) {
            strerror("fopen");
            exit(EXIT_FAILURE);
        }
        return fp;
    }
    int main(int argc, char **argv)
    {
        const size_t BUFSIZE = 8192;
    
        FILE *src, *dest;
        char buf[BUFSIZE];
        size_t n;
    
        src = Fopen(argv[1], "rb");
        dest = Fopen(argv[2], "w+b");
    
        while ((n = fread(buf, 1, BUFSIZE, src)) > 0)
            fwrite(buf, 1, n, dest);
    
        fclose(src);
        fclose(dest);
        return 0;
    }
    

    我没有测试过代码,所以请告诉我是否有问题。

答案 1 :(得分:0)

const size_t buffer_size = 8192;
char buffer[100]; // 100 should be buffer_size instead

您没有为缓冲区分配缓冲区大小

此外,您可能写错了字节数:

        fwrite(buffer, sizeof(char), buffer_size, target);

您应该写回a个字节,然后将buffer_size替换为a

答案 2 :(得分:0)

在提到的其他问题中,如果通过“删除目标文件的所有字段”表示文件目标文件已删除所有内容而您不想,则需要阅读man page,因为它说:

  

<强> W +

     

开放阅读和写作。如果没有,则创建该文件   存在,否则被截断。流位于   文件的开头。

因此,

target = fopen(argv[2], "w+b");

在打开目标文件时从目标文件中删除所有预先存在的数据。

  

我该如何解决这个问题?

以追加模式打开文件:

  

<强>一个

     

打开追加(在文件末尾写)。该文件是                 如果它不存在则创建。流位于                 文件的结尾。

像这样:

target = fopen(argv[2], "ab");

仅使用

target = fopen(argv[2], "a+b");

如果您还想阅读target

相关问题