fgets () Linux против Mac - PullRequest
       11

fgets () Linux против Mac

3 голосов
/ 14 января 2010

Читает ли fgets на Mac до возврата каретки '\ r' или это также зависит от новой строки '\ n'?

Причина в том, что я использую fgets для чтения файла за раз. Однако, если он запускается на Mac-файле с только '\ r' для конца строки, он не может сделать то, что я хочу. (запустить в Linux)

Я не хочу писать функции библиотечного типа для решения проблем перекрестной совместимости. Есть ли другая стандартная функция, которую я мог бы использовать вместо?

Ответы [ 6 ]

4 голосов
/ 14 января 2010

Если вы строго придерживаетесь C, вы можете попробовать использовать getdelim(), если он доступен в вашей системе.

3 голосов
/ 14 января 2010

Ой, подождите, я пропустил "запустить на linux" с "файлом Mac с CR".

ОК, ответ таков: документация fgets() явно ссылается на "перевод строки" как терминатор строки. В частности, нельзя ожидать, что реализации Unix / Linux услышали о представлении старого Mac о CR как об окончании строки; поэтому неудивительно, что fgets не видит эти CR в конце строки.

Обновление:

Я настоятельно рекомендую избегать большинства проблем - использовать утилиту командной строки, такую ​​как tr, чтобы просто перевести файл перед тем, как запустить в него программу.

1 голос
/ 14 января 2010

Когда Mac перешел с Mac OS 9 на Mac OS X, соглашение об окончании строк изменилось с линий, оканчивающихся на \r на \n, поскольку Mac OS X построена поверх BSD, в которой \n обычный перевод строки. Таким образом, даже на Mac fgets будет анализировать строки, разделенные \n, а не \r.

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

1 голос
/ 14 января 2010

Готовы ли вы изменить свой код, чтобы иметь дело с окончаниями строк в стиле Mac? Вы никогда не будете иметь дело с обычными окончаниями строк Unix? Или вы хотите функцию, которая принимает любой стиль? Это не разумно.

Почему бы просто не передать все сомнительные файлы через TR, чтобы изменить CR на LF, а затем прочитать канал. Не нужно создавать дополнительные файлы. Независимо от того, имели ли исходные файлы CR или нет, код будет работать со стандартными fgets.

1 голос
/ 14 января 2010

Вы говорите о MacOS X или MacOS 9 (или более ранних версиях)?

  • В MacOS 9 или более ранней версии библиотека остановится на «\ r».
  • В MacOS X терминатор строки равен '\ n', как и в любой другой системе Unix.
0 голосов
/ 14 января 2010

Библиотека C на Mac должна «делать правильные вещи».

Кстати, Linux и Mac оба используют \ n в качестве ограничителя строки, а не \ r

...