Изменение std:: endl для вывода CR+LF вместо LF
Я пишу программу на платформе Linux, которая генерирует текстовые файлы, которые будут просматриваться, неизбежно, на платформе Windows.
сейчас, передает std::endl на ostream создает символ CR только для новых строк. Естественно, эти текстовые файлы выглядят неправильно в MS Notepad.
- есть ли способ изменить
std::endlтакой, что он использует CR+LF для новой строки вместо LF? - Я знаю, что могу написать свой собственный манипулятор, например
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.
вот мое решение проблемы. Это немного мешанина всей информации, представленной в ответах:
-
Я создал макрос в win_endl.H файл для новой строки, которую я хотел:
#define win_endl "\r\n" -
затем я сделал поиск-и-замену:
sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
и обеспечил все мои файлы, включенные win_endl.h.