Изменение 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, или это глупая идея для удобства обслуживания?

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

10 голосов | спросил J. Polfer 30 +03002009-10-30T22:50:02+03:00312009bEurope/MoscowFri, 30 Oct 2009 22:50:02 +0300 2009, 22:50:02

5 ответов


0

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

Я не уверен, как вы планируете перегрузить или изменить endl, и изменение его поведения, безусловно, будет удивительным для любого нового разработчика к вашему проекту. Я бы порекомендовал переключиться на win_endl (это должен быть простой поиск и замена) или, возможно, переключиться со стандартного ostream на поток фильтрации Boost.Iostreams , чтобы выполнить преобразование для вас .

ответил Josh Kelley 30 +03002009-10-30T22:58:38+03:00312009bEurope/MoscowFri, 30 Oct 2009 22:58:38 +0300 2009, 22:58:38
0

std::endl в основном:

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

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

Из заголовочного файла ostream на endl:

  

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

ответил ebo 30 +03002009-10-30T22:55:34+03:00312009bEurope/MoscowFri, 30 Oct 2009 22:55:34 +0300 2009, 22:55:34
0

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

Эта проблема - ошибка в Блокноте.

ответил Greg Hewgill 30 +03002009-10-30T22:59:52+03:00312009bEurope/MoscowFri, 30 Oct 2009 22:59:52 +0300 2009, 22:59:52
0

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

Таким образом, тот же код будет выплевывать \ n в Unix, \ r \ n в Windows и \ r в Mac.

ответил zumalifeguard 30 +03002009-10-30T22:57:15+03:00312009bEurope/MoscowFri, 30 Oct 2009 22:57:15 +0300 2009, 22:57:15
0

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

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

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

    [email protected]\_machine > sed -i 's/std::endl/win_endl' *
    

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

ответил J. Polfer 31 +03002009-10-31T00:24:04+03:00312009bEurope/MoscowSat, 31 Oct 2009 00:24:04 +0300 2009, 00:24:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132