为什么 printf 会创建 Windows 的换行符?

4

我正在尝试复制(并稍后修改)一个 .ppm 文件。 我正在使用 mingw g++ 在 Windows 10 上操作。 原始文件仅包含 LF,但使用我的程序创建的文件包含 CRLF,这会破坏 .ppm 文件。 尽管我没有在任何地方使用 \r\n,但它仍然被输出。

FILE *fp;
FILE *dest;

char magicNumber[3];
int width, height, depth;
unsigned char red, green, blue;
unsigned char* buff;

printf("Hello, World!\n");


fp = fopen("lenna.ppm", "r+");

fscanf(fp, "%s", magicNumber);
fscanf(fp, "%d %d %d", &width, &height, &depth);
printf("%s %d %d %d nums\n", magicNumber, width, height, depth);


dest = fopen("lena2.ppm", "w+");
fprintf(dest, "%s\n%d %d\n%d", magicNumber, width, height, depth);

结果在

enter image description here

为什么?

我只想要 LF。如何做到?


2
你之所以得到Windows行尾符,是因为你在Windows上使用非二进制模式文件,并且stdio函数将换行符转换为回车和换行符(读取文件时则相反)。 - Shawn
1个回答

8

以二进制模式打开您的文件:

fopen("lena2.ppm", "wb+");

文档中说明:

在文本模式下,回车换行组合在输入时被转换为单个换行符,在输出时将换行符字符转换为回车换行组合。


@ditoslav:为了完整性,请确保使用 fclose() 函数关闭文件。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接