Разница между std::endl и (относительно осведомленности о платформе)

StackOverflow https://stackoverflow.com//questions/9699280

  •  13-12-2019
  •  | 
  •  

Вопрос

Прежде чем вы объявите этот вопрос дубликатом этот или тот, пожалуйста, учтите, что я отправил проблему в онлайн-судья с \n и получил WA, а затем с std::endl и включил кондиционер.Итак, мне нужен очень конкретный ответ на этот вопрос. осведомленность о платформе:Является \n действительно ли платформа осведомлена, и действительно ли среда выполнения записывает правильную строку, заканчивающуюся в соответствии с платформой, как утверждается в ответах на другие вопросы?Если да, то не могли бы вы, пожалуйста, рассказать мне, как это произошло??

Если ответ может быть подкреплен цитатой из стандарта, касающейся проблемы осведомленности о платформе, я был бы очень благодарен.Я прочитал ответы на все остальные вопросы (даже на закрытые), поэтому, пожалуйста, не повторяйте фразу "очищает буфер".

Это было полезно?

Решение

От C++11, §27.7.3.8 -

namespace std
{
    template <class charT, class traits>
        basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}

Эффекты:Вызывает os.put(os.widen(’ ’)), затем os.flush().

Возвращает:os.

Итак, из стандарта ясно, что endl очищает буфер выходного потока, в то время как \n не.Как правило, вы захотите использовать endl для печати новой строки, но вы также должны иметь в виду, что каждый раз, когда вы это делаете, выходной буфер тоже будет очищаться.

Об осведомленности о платформе

Из стандарта очевидно, что оба делают одно и то же - печатают новую строку точно таким же образом.Итак, если один из них не зависит от платформы, то другой также должен быть таким же.Поскольку я знаю наверняка endl является независимым от платформы, то же самое должно быть и для \n.

Другие советы

std::endl это манипулятор, который выводит '\n', затем спускает струю.Для большинства повседневных целей это то, что вам следует использовать.Однако при выводе больших объемов данных это может привести к значительному снижению производительности, и в этом случае используйте '\n'.

РЕДАКТИРОВАТЬ:

Что касается осведомленности о платформе:оба выводят одно и то же.Если поток был открыт в текстовом режиме, то '\n' приведет к появлению зависящего от платформы представления окончания строки:0x0A под Unix, 0x0D, 0x0A под Windows, запуск новой записи под некоторыми мэйнфреймами и т.д.Если поток был открыт в двоичном режиме, это приведет к выводу одного байта (обычно 0x0A, но на самом деле это зависит от используемой базовой кодировки символов).

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