Портативный способ определения линейного разделителя платформы - PullRequest
11 голосов
/ 01 мая 2010

На разных платформах используются разные схемы разделителей строк (LF, CR-LF, CR, NEL, Unicode LINE SEPARATOR и т. Д.). Библиотеки времени выполнения C ++ (и C) делают большую часть этого прозрачной для большинства программ путем преобразования '\n' в исходное кодирование новой строки целевой платформы и обратно. Но если вашей программе нужно определить действительную последовательность байтов, как вы могли бы это сделать переносимо?

Лучший метод, который я придумал:

  1. Запишите временный файл в текстовом режиме, указав '\n', что позволит переводу выполнять его во время выполнения.
  2. Считайте временный файл в двоичном режиме, чтобы увидеть действительные байты.

Это кажется глупым. Есть ли способ сделать это без временных файлов? Вместо этого я попробовал поток строк, но время выполнения на самом деле не переводит '\n' в этом контексте (что имеет смысл). Предоставляет ли среда выполнения эту информацию другим способом?

1 Ответ

7 голосов
/ 01 мая 2010

Я не эксперт по C / C ++, но в стандартной библиотеке нет ничего такого, что могло бы напрямую дать вам разделитель строк. Перевод выполняется прозрачно с помощью файловых функций текстового режима.

Даже если вы чувствуете, что ваш подход «грязный», он, вероятно, самый простой и надежный, поскольку вы действительно проверяете, какой разделитель строк используется и записывается. И является переносимым, так как вы используете стандартные библиотечные функции для записи и чтения файла.

...