为什么编译代码在Linux中的窗口中创建损坏的文件工作正常

时间:2017-07-18 13:31:35

标签: c linux windows gcc copy

以下代码,使用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);
}

1 个答案:

答案 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");

应该解决你的问题。