你好我们制作了一个复制二进制文件的程序,但我有一个问题:当我试图将源文件的字段复制到目标文件时,它会删除目标文件的所有字段。我怎么解决这个问题?
#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;
}
答案 0 :(得分:1)
您声明buffer_size
为8192,但您只分配100个字符而不是buffer_size
。所以改变声明。此外,常量通常是全部大写。
您需要将a
个字节写入目标文件,而不是buffer_size
,因为该文件甚至可能不是buffer_size
个字符!
检查fopen
的返回值;失败时返回NULL
。查看strerror
以打印错误原因。
你的循环错了。只需循环fread
返回BUFSIZE(即fread
读取BUFSIZE字符)。
永远不要使用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;
}
我没有测试过代码,所以请告诉我是否有问题。
答案 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
。