Изменение std:: endl для вывода CR+LF вместо LF

Я пишу программу на платформе Linux, которая генерирует текстовые файлы, которые будут просматриваться, неизбежно, на платформе Windows.

сейчас, передает std::endl на ostream создает символ CR только для новых строк. Естественно, эти текстовые файлы выглядят неправильно в MS Notepad.

  1. есть ли способ изменить std::endl такой, что он использует CR+LF для новой строки вместо LF?
  2. Я знаю, что могу написать свой собственный манипулятор, например win_endl, для создания собственных новых строк, но я использую std::endl символ во многих местах, и, как и многие программисты, имеют тенденцию делать то, что требует меньше всего работы. Могу ли я просто перегрузить std::endl производить CR+LF, или это глупая идея для ремонтопригодности?

NB: я проверил этот вопрос, но он спрашивает о том, чтобы пойти в другую сторону, и принятый ответ кажется довольно неполным.

5 ответов


открытие файла в текстовом режиме должно вызвать std::endl для преобразования в соответствующую строку, заканчивающуюся для вашей платформы. Ваша проблема в том, что строки is необходимые для вашей платформы, но файлы не предназначены для вашей платформы.

Я не уверен, как вы планируете перегружать или изменять endl, и изменение его поведения, безусловно, будет удивительным для любых разработчиков, новых для вашего проекта. Я бы рекомендовал переключиться на win_endl (должен быть простым search-and-replace) или, возможно, переключение со стандартного ostream до импульс.Iostreams filtering stream чтобы сделать преобразование для вас.


std::endl фактически:

std::cout << "\n" << std::flush;

Так что просто используйте "\r\n" вместо этого и опустить флеш. Так тоже быстрее!

из файла заголовка ostream на endl:

этот манипулятор часто ошибочно используется, когда требуется простая новая строка, что приводит к низкой производительности буферизации.


Блокнот Windows в значительной степени только программа Windows вы найдете, что не обрабатывает файлы только LF должным образом. Почти все остальное (включая WordPad) обрабатывает только файлы LF просто отлично.

эта проблема является ошибкой в блокноте.


вы не должны использовать \r\n. Просто используйте \n, но затем откройте поток в режиме "текст", который сделает преобразование для вас. Вы можете не заботиться о кросс-платформенной, но это официальный способ сделать это.

таким образом, тот же код будет выплевывать \n в unix, \r\n в windows и \r на mac.


вот мое решение проблемы. Это немного мешанина всей информации, представленной в ответах:

  1. Я создал макрос в win_endl.H файл для новой строки, которую я хотел:

    #define win_endl "\r\n"
    
  2. затем я сделал поиск-и-замену:

    sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
    

и обеспечил все мои файлы, включенные win_endl.h.