Изменение 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, или это глупая идея для удобства обслуживания? Примечание: я проверил этот вопрос , но он задает вопрос о том, чтобы пойти другим путем, и принятый ответ кажется довольно неполным.
Решение
Открытие файла в текстовом режиме должно привести к преобразованию std :: endl
в соответствующий конец строки для вашей платформы. Ваша проблема в том, что символ новой строки подходит для вашей платформы, но файлы, которые вы создаете, не предназначены для вашей платформы.
Я не уверен, как вы планируете перегружать или изменять endl
, и изменение его поведения, безусловно, будет удивительным для всех разработчиков, впервые знакомых с вашим проектом. Я бы порекомендовал перейти на win_endl (это должен быть простой поиск и замена) или, возможно, переключиться со стандартного ostream
на Фильтровать поток Boost.Iostreams , чтобы выполнить преобразование за вас.
Другие советы
std :: endl
в основном:
std::cout << "\n" << std::flush;
Так что просто используйте " \ r \ n "
и пропустите сброс. Так быстрее тоже!
Из заголовочного файла ostream на endl:
Этот манипулятор часто ошибочно используется, когда требуется простой перевод строки, что приводит к снижению производительности буферизации.
Windows Notepad - это в значительной степени только программа для 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
.