如何在c中将一个二进制文件写入另一个文件

时间:2015-12-18 09:56:56

标签: c

我有一些二进制文件要写入输出文件。 因此,我使用char作为缓冲器编写了这个函数,天真地认为它可以工作。

//Opened hOutput for writing, hInput for reading

void faddf(FILE* hOutput, FILE* hInput) {
    char c;
    int scan;
    do{
        scan = fscanf(hInput, "%c", &c);
        if (scan > 0)
          fprintf(hOutput, "%c", c);
    } while (scan > 0 && !feof(hInput));
}

执行此函数可以在开头的二进制文件中输出少量可读的char。所以我这样试了:

void faddf(FILE* hOutput, FILE* hInput) {
  void * buffer;
  int scan;
  buffer = malloc(sizeof(short) * 209000000);
  fread(buffer, sizeof(short), 209000000, hInput);
  fwrite(buffer, sizeof(short), 209000000, hOutput);
  free(buffer);
}

这“有效”,但仅在文件小于我的“幻数”时才有效吗?有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您应该避免每字节读取个字节。使用fgets()功能代替fscanf().

请参阅:Man fgets() (for Windows)

当你打开彼此相邻的两个文件(输入一个/输出一个)时,你说输出文件只包含可读字符......但是你的文本编辑器可以在输入文件上显示不可读的字符吗?

答案 1 :(得分:1)

我不应该首先问这个问题,但这是我最终如何做到的:

void faddf(FILE* hOutput, FILE* hInput) {
    void * buffer;
    int scan,size;
    size_t read;

    //get the input file size
    fseek(hInput, 0L, SEEK_END);
    size = ftell(hInput);
    fseek(hInput, 0L, SEEK_SET);

    //place the get space
    buffer = malloc(size);
    if (buffer == NULL)exit(1);//should fail silently instead

    //try to read everything to buffer
    read = fread(buffer, 1, size, hInput);

    //write what was read
    fwrite(buffer, 1, read, hOutput);

    //clean up
    free(buffer);
}

答案 2 :(得分:1)

虽然您的新代码(在the answer中)比旧代码好得多,但它仍然可以进行改进和简化。

具体来说,您可以通过以块的形式复制文件来避免任何内存问题。

void faddf( FILE *fpout, FILE *fpin )
{
    char buffer[4096];
    size_t count;

    while ( (count = fread(buffer, 1, sizeof buffer, fpin)) > 0 )
        fwrite(buffer, 1, count, fpout);
}