fwrite在linux中打印不需要的NUL

时间:2015-04-09 17:23:59

标签: c

已经问过这个问题的各种版本,但不幸的是,没有一个版本解释了我用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);

我认为这与缓冲'的方式有关。已定义,但我真的在我的智慧结束。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:4)

fseek(fps,0L,SEEK_END);

不会将当前位置放在文件的最后一个字节处。它将当前位置放在文件的最后一个字节之外(紧接在最后一个字节之后)。这意味着文件大小为

filesize = ftell(fps);

你不应该加1。您尝试读取一个额外字节(实际上不存在)是在目标文件中产生额外字符的原因。