Разница между std :: endl и \ n (в отношении осведомленности о платформе) - PullRequest
2 голосов
/ 14 марта 2012

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

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

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

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

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

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

5 голосов
/ 14 марта 2012

С 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 (’\ n’)), затем os.flush ().

Возвращает:. ОС

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

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

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

...