【问题标题】:copying binary files - source and target in c programming复制二进制文件 - c 编程中的源和目标
【发布时间】:2016-05-07 08:06:05
【问题描述】:

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

#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;

}

【问题讨论】:

  • “当我试图将源文件的字段复制到目标文件时,它会删除目标文件的所有字段。”什么意思?
  • 它只是删除了文件的字段,现在它是空的
  • 缓冲区大小错误,target 未检查,feof() 使用错误,fwrite() 大小错误。
  • 那么你能告诉我如何解决这个问题吗?
  • 那么程序正在做你想做的事(大部分)。使用 stackptr 发布的代码,它会做你想要的。

标签: c file binary argv argc


【解决方案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,因为它非常不便携。

修改后的程序是

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;
}

我没有测试过代码,如果有问题请告诉我。

【讨论】:

  • 移除目标字段
  • @DanielZingerman 你一直说它正在删除“领域”。你是什​​么意思?这完全是没有人理解的非标准术语。
  • 源文件还是目标文件?更详细@DanielZingerman 你的陈述很模糊
  • 看来你真的想要一个 `while ((n = fread(buf, 1, BUFSIZE, src)) > 0)`,不是吗?
  • @Till Good catch。我希望 OP 引起注意,因为如果源文件小于该最大缓冲区大小常数,它将导致他所看到的症状。目标文件将被截断为空,并且不会写入任何内容。
【解决方案2】:

在提到的其他问题中,如果“删除目标文件的所有字段”是指文件目标文件已删除所有内容而你不希望这样做,则需要阅读man page,因为它说:

w+

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

因此,

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

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

我该如何解决这个问题?

以追加模式打开文件:

一个

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

像这样:

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

只使用

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

如果您还想阅读target

【讨论】:

    【解决方案3】:
    const size_t buffer_size = 8192;
    char buffer[100]; // 100 should be buffer_size instead
    

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

    另外,您可能写入了错误的字节数:

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

    你应该写回a字节,所以用a换掉buffer_size

    【讨论】:

    • 你是什么意思我是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2016-04-20
    • 2012-09-28
    • 2013-01-24
    相关资源
    最近更新 更多