已经问过这个问题的各种版本,但不幸的是,没有一个版本解释了我用fwrite看到的行为。
我正在尝试将文件(fread)读入缓冲区,然后将缓冲区(fwrite)写入另一个文件。 fwrite写入的字节数是预期的,但是当我打印出文件时,我看到了一个' NUL'末尾的字符,原始文件中不存在。
以下是代码的相关部分,
fps = fopen(source, "rb");
fpd = fopen(destination, "w+b");
// Get source file size
fseek(fps,0L,SEEK_END);
filesize = ftell(fps)+1;
fseek(fps,0L,SEEK_SET); //Reset file pointer
char *buffer = malloc(filesize * sizeof *buffer);
fread(buffer,1,filesize,fps);
int dsize = fwrite(buffer,1,filesize,fpd);
这是打印"目的地"的代码。每个角色都有文件。
int c;
while ((c = fgetc(fpd)) != EOF) {
printf("Character -> %d\n", c);
}
printf("Character EOF-> %d\n", c);
我认为这与缓冲'的方式有关。已定义,但我真的在我的智慧结束。
非常感谢你的帮助!
答案 0 :(得分:4)
此
fseek(fps,0L,SEEK_END);
不会将当前位置放在文件的最后一个字节处。它将当前位置放在文件的最后一个字节之外(紧接在最后一个字节之后)。这意味着文件大小为
filesize = ftell(fps);
你不应该加1。您尝试读取一个额外字节(实际上不存在)是在目标文件中产生额外字符的原因。