windows 系统的文件换行符不是\r\n 吗,为什么下面的 c 程序的输出结果不太一样

2024-03-16 16:02:48 +08:00
 rookiemaster

c 程序:

#include <stdio.h>
int main()
{
    FILE *fd = fopen("tmpfile.txt", "r");
    

    char c;
    while ((c = getc(fd)) != EOF)
    {
        printf("%d, ", c);
    }
}

tmpfile.txt 内容:
1
2

程序输出结果: 49, 10, 50,

程序不应该是输出: 49, 13, 10, 50,

吗?

补充:在 win11 下执行

1193 次点击
所在节点    问与答
3 条回复
geelaw
2024-03-16 16:15:31 +08:00
首先,Windows 不可能要求 txt 文件一定按某种格式存储,或许你的 txt 文件里面只有三个字节。所谓 Windows 的换行是 \r\n 是指通常的 Windows 软件会这样存储换行,但如 VSCode 等代码工具可以配置换行方式。

其次,这是 C 语言的抽象,任何平台的行分隔序列、行结尾序列,在文本模式下都会在通过 FILE 进入 C 语言时被变换为 \n ,并且 \n 会在通过 FILE 进入平台时换成平台特定的序列。要获得文件的字节内容,应该用二进制操作,即 rb 、wb 。
rookiemaster
2024-03-16 16:21:09 +08:00
@geelaw 感谢,在 vscode 下改成 CRLF 确实输出了 49, 13, 10, 50, 奇怪的是在 win11 下打开 txt 文件,记事本右下角确实显示的是 Windows(CRLF)
ShinichiYao
2024-03-16 16:45:56 +08:00
显示 CRLF 表示你敲回车会输入\r\n ,不代表不会把\n 显示为换行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1024265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX