Изменение std :: endl для выпуска CR + LF вместо LF - PullRequest
10 голосов
/ 30 октября 2009

Я пишу программу на платформе 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 ]

10 голосов
/ 30 октября 2009

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

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

10 голосов
/ 30 октября 2009

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

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

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

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

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

5 голосов
/ 30 октября 2009

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

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

2 голосов
/ 30 октября 2009

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

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

0 голосов
/ 31 октября 2009

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

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

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

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

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

...