Вопрос

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top