Изменение 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
.