提问人:user129393192 提问时间:8/4/2023 更新时间:8/4/2023 访问量:53
我应该指望换行符是什么字符?
What character should I count on the newline character being?
问:
我正在编写一个文本编辑器,我想在 macOS 和 Linux 上运行并符合 POSIX。在解析原始文本文件时,我应该期待(旧 MacOS)还是(新 MacOS 和 Linux)还是应该期待 (Windows)?CR
LF
CR+LF
答:
在解析原始文本文件时,我应该期待(旧 MacOS)还是(新 MacOS 和 Linux)还是应该期待 (Windows)?
CR
LF
CR+LF
您是否有理由相信您的软件的任何用户都不会创建包含任意字节序列的文件,然后要求您的软件对其进行操作?
您是否有理由相信您的软件的任何用户都不会将文件从某些外国系统或古老的存储介质复制到他们的主系统上,然后要求您的软件对其进行操作?
当用户这样做时,你希望你的软件做什么?
直接回答,你应该期待吗?不,因为您不知道用户会做什么。你应该为此做好准备吗?是的,因为你不知道用户会做什么。
评论
\n
stdio
\n
CR + LF
read
write
\r
CR
\n
LF
\r
CR
\n
LF
\r
CR
read
write
\n
read(STDIN_FILENO, buf, 1) && buf == '\n'
LF
read(STDIN_FILENO, buf, 1) && buf == '\r'
CR
如果您希望您的编辑器具有多功能性并以合理的方式处理来自各种系统的文件,您应该接受行结束序列的所有 3 种可能性:单个 LF 字节用于 unix 系统,包括 linux 和 OS/X,单个 CR 字节用于在较旧的 macOS 版本上创建的文件,以及序列 CR+LF 用于在 Microsoft Windows 上生成的文件, MS/DOS 和原始的 CP/M 系统。
您可以通过扫描文件的开头来自动检测行尾风格:如果您找到 CR+LF 序列,则您有一个 Windows 文件,如果您有 CR 字节后跟 LF,则是一个 oldmac 文件,如果您有 LF 字节,则它是一个 unix 文件,如果上述都不存在,它要么是二进制文件,要么是没有行尾的单行文本文件。对于这些,请使用当前执行平台的默认值。
是保留行尾风格以进行修改,还是将行尾序列转换为本地风格是一个设计决策。在 Quick Emacs 中,我选择保留行尾风格,并让用户使用特定命令按需执行转换。
在任何情况下,您都应该以二进制模式打开文件进行读取和写入,并在程序中显式处理行尾。
评论
\n
'\n'
'\r'
fgets()
getdelim()
fgets()
getline()
'\r'