在C中,我通常一次读取文本文件的一个字符(例如,在FSM,标记化的环,并在同一时间解析)。不幸的是,一些操作系统使用不同的方法来标记行的末尾,例如, Unix("\n"
),Mac OS("\r"
)和DOS/Windows("\r\n"
)。如何检测来自不同操作系统的文本文件的行尾?
因此我的问题:如何正确检测跨越文本文件的行结束,从不同的操作系统?
我目前的做法是把'\r'
为'\n'
而忽略空行。不幸的是,这种方法只有在空行不会改变底层文本的语义时才起作用。
我不想“检测”每个文件的行结束风格,我当然不希望基于#ifdef
或其他类型的条件编译的解决方案。还有没有有效的解决方案?
你可以简单地忽略/丢弃任何“\ r”字符? – Brendan 2011-04-08 23:02:37
@Brendan:截至目前,我一直都能这样做。但我可以想象一个空行实际上有一些含义的场景(例如,从内容中分离标题)。在这种情况下,如果我将Windows文本文件提供给程序,则会错误解释其内容,因为“\ r \ n”(一行结尾)被视为“\ n \ n”(两行结尾)。 – Philip 2011-04-08 23:05:10