Как определить окончания строк в текстовых файлах из разных ОС? - PullRequest
2 голосов
/ 09 апреля 2011

В C я обычно читаю текстовые файлы по одному символу за раз (например, в цикле FSM, разбивке токенов и разборе одновременно).К сожалению, некоторые операционные системы используют разные методы для обозначения конца строки, например Unix ("\n"), Mac OS ("\r") и DOS / Windows ("\r\n").

Отсюда мой вопрос: как правильно определить окончание строк в текстовых файлах из разных операционных систем?

Мой текущий подход заключается в обработке '\r' как '\n' и игнорировании пустых строк.К сожалению, этот подход работает только до тех пор, пока пустые строки не изменяют семантику основного текста.

Я бы не хотел "определять" стиль окончания строки для каждого файла, и я, конечно, неНе нужны решения, основанные на #ifdef или других видах условной компиляции.Остались ли действительные решения?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

Обычно я не рекомендую читать файл по одному символу за раз, но для вашего случая я бы посоветовал вам «заглянуть» вперед на один символ, используя следующую логику ...

if c == '\r'
    p = peek
    if p == '\n'
        read next c

Вы не можете поверить, что все файлы имеют определенное сходство или даже то, что файл следует одному и тому же соглашению во всем себе, поэтому вы должны кодировать для всех случаев. В этом случае, если вы видите \ r, вы можете увидеть \ n, и если вы потребляете следующий символ и двигаетесь дальше.

1 голос
/ 09 апреля 2011

Мой обычный подход - трактовать '\n' как терминатор строки, и, если предыдущий символ был '\r', удалите его (обычно я заканчиваю тем, что перезаписываю либо один, либо другой 0). Если вы также хотите поддерживать устаревшие текстовые файлы Mac ('\r' - только переводы строк), тогда вы можете использовать один из следующих вариантов: lone '\r', lone '\n' или пара "\r\n" как разрыв строки. 1007 *

1 голос
/ 09 апреля 2011

К сожалению, файл может иметь смешанные окончания строк, если он был обойден или отредактирован с помощью редакторов, которые позволяют вам указать конец строки, или по ряду других подобных причин.Для определения "стиля окончания строки для файла может потребоваться голосование - большинство строк, заканчивающихся стилем X побед.

Что ясделано

  1. обработать \r как новую строку.если следующий символ \n, откажитесь от него.(если следующий символ не \n, то \r по-прежнему считается новой строкой)

  2. обрабатывает \n как новую строку, если вы не выбросили его из-за (1)

...