我正在寻找一种在运行时获取平台行尾字符序列(Windows 的 CRLF,Linux/macOS 的 LF)的方法。
我不认为有任何功能可以专门执行此操作。即使标准库的行感知功能也不会:
BufRead::read_line
被记录为仅识别\n
,而BufRead::lines
(源)(它会去除行尾字符)仅这样做对于 \n
和 \r\n
,不区分在哪个平台上调用它。
不过,“站台线路结束”确实是一个类别错误。文件通过网络发送并从一台计算机复制到另一台计算机。如果你的程序写入需要在 Windows 上用记事本打开的文件,那么生成它们的程序是运行在 Windows 还是 Linux 上并不重要;它需要发出
\r\n
。同样,如果程序正在编写特定的文件格式或实现某些网络协议;格式或协议应该告诉您使用什么行分隔符。如果格式允许并且没有约定,请选择您喜欢的;只要坚持使用即可。
如果您正在阅读行结尾,您可能应该容忍其中任何一个,就像
BufRead::lines
一样。
但是,如果您确实需要,例如如果您的输出将被一个编写得不好的程序读取,该程序期望在不同平台上有不同的行结尾,您可以使用条件编译属性来实现此效果:
#[cfg(windows)]
const LINE_ENDING: &'static str = "\r\n";
#[cfg(not(windows))]
const LINE_ENDING: &'static str = "\n";
在您可能认为自己明确关心的情况下,您可能不应该像内置的 String::lines() 那样。