![](/img/trans.png)
[英]How do you format output text such that variable strings of different length line up across multiple lines?
[英]How to detect line endings across text files from different OS?
在C语言中,我通常一次读取一个字符的文本文件(例如,在FSM循环中,同时进行标记和解析)。 不幸的是,某些操作系统使用不同的方法来标记行的结尾,例如Unix( "\\n"
),Mac OS( "\\r"
)和DOS / Windows( "\\r\\n"
)。
因此,我的问题是:如何正确检测来自不同操作系统的文本文件中的行尾?
我当前的方法是将'\\r'
视为'\\n'
并忽略空行。 不幸的是,这种方法仅在空行不改变基础文本的语义的情况下才有效。
我不想“检测”每个文件的行尾样式,并且我当然也不想基于#ifdef
或其他类型的条件编译的解决方案。 还有有效的解决方案吗?
我通常不建议一次读取一个字符的文件,但是对于您的情况,我建议您“偷看”一个字符使用以下逻辑...
if c == '\r'
p = peek
if p == '\n'
read next c
您不能真正相信所有文件都具有某种相似性,甚至不能相信文件本身遵循相同的约定,因此您应该为所有情况编写代码。 在这种情况下,如果您看到\\ r,则可能会看到\\ n,并且如果确实消耗了下一个字符并继续前进。
不幸的是,如果文件被传递了,或者使用允许您指定行尾的编辑器进行了编辑,或者由于许多其他类似原因,文件可能具有混合的行尾。 确定文件的“ the”行结束样式可能是投票的问题-多数以样式X结尾的行会获胜。
我所做的是
将\\r
当作换行符。 如果下一个字符是\\n
则将其丢弃。 (如果下一个字符不是\\n
则\\r
仍算作换行符)
将\\n
视为换行符,除非您将其丢弃为(1)
我通常的做法是将'\\n'
视为行终止符,如果前一个字符为'\\r'
,请将其删除(通常我最终会用0覆盖一个或另一个)。 如果您还想支持旧版Mac文本文件(仅'\\r'
换行符),则可以采用单独的'\\r'
,单独的'\\n'
或对"\\r\\n"
作为换行符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.