以下代码,使用gcc -o copy.exe copy.c在Windows下使用minGW-w64(i686-7.1.0-posix-dwarf-rt_v5-rev0)中的gcc.exe编译,用于复制时创建垃圾文件一份文件;复制很多或太少的字节。在Linux下使用gcc它工作正常(源和目标有相同的md5,文本文件,二进制文件,并不重要)
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE *fp = fopen(argv[1], "rb");
FILE *fpo = fopen(argv[2], "w");
int SIZE = 1000000;
char buffer[SIZE];
size_t bytes;
while (0 < (bytes = fread(buffer, 1, SIZE, fp)))
fwrite(buffer, 1, bytes, fpo);
fclose(fp);
fclose(fpo);
return(0);
}
答案 0 :(得分:3)
问题在于您读入了二进制数据,但之后您尝试将该数据写为文本,如您选择执行此操作的模式所示:
FILE *fp = fopen(argv[1], "rb");
FILE *fpo = fopen(argv[2], "w");
这将导致Windows和其他可能的操作系统出现问题,因为不同的标准库对行结尾的处理方式不同。 Windows使用\r\n
作为行结尾,当从 text 文件读入时转换为\n
,而在Linux下,行结尾为\n
,无需转换为\n
。在编写文本文件时,Windows会将\n
转换为\r\n
,而Linux不需要对其行结尾进行转换。
将第二行更改为
FILE *fpo = fopen(argv[2], "wb");
应该解决你的问题。