繁体   English   中英

如何检测来自不同操作系统的文本文件中的行尾?

[英]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结尾的行会获胜。

我所做的是

  1. \\r当作换行符。 如果下一个字符是\\n则将其丢弃。 (如果下一个字符不是\\n\\r仍算作换行符)

  2. \\n视为换行符,除非您将其丢弃为(1)

我通常的做法是将'\\n'视为行终止符,如果前一个字符为'\\r' ,请将其删除(通常我最终会用0覆盖一个或另一个)。 如果您还想支持旧版Mac文本文件(仅'\\r'换行符),则可以采用单独的'\\r' ,单独的'\\n'或对"\\r\\n"作为换行符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM