12

Есть два способа записать перевод строки - std::endl и \n. В чем разница? Когда что использовать?

Abyx
  • 31,143

2 Answers2

17

std::endl реализован как os.put(os.widen(’\n’)); os.flush();. Соответственно всё отличие в том, что endl вызывает flush(), а \n - нет.

Вызов flush() очищает буфер потока, и если выполнять его слишком часто, он может ощутимо замедлить выполнение программы.

Также надо помнить что std::endl не нужен там где стандартная библиотека сама вызывает cout.flush():

  • при завершении программы
  • при чтении из std::cin
  • при записи в std::cerr

Некоторые реализации буферизуют вывод в stdout построчно, и запись \n сама будет вызывать flush.

Записать буфер можно явно, манипулятором std::flush, например

std::cout << "Calculating XYZ ... " << std::flush; wait_XYZ(); std::cout << "OK\n";

Ссылки

Abyx
  • 31,143
  • 1
    Ещё по теме: http://en.cppreference.com/w/cpp/io/manip/unitbuf – VladD May 02 '15 at 10:26
  • Ещё от меня, чуточку по теме, но когда использовать cout, cerr, clog: http://htrd.su/wiki/zhurnal/2016/03/15/std_cout_std_cerr_i_std_clog – Monah Tuk Mar 17 '16 at 04:15
  • Я бы еще добавил что std::endl удобно вызывать когда у нас есть буфер который необходимо вывести, т.к. у буфера может не быть \n. –  Dec 02 '17 at 15:40
-6

Надо помнить, что в с++ файлы сами не закрываются при выходе из проги. Может и закрываются, но только в памяти, а на диске файл будет не виден. Правильно сказал предыдущий человек: смотря какую цель преследуете. Возможно не нужно так часто флашить, особенно в цикле.

Пишите "@": чтоб на почту пришло. Я случайно увидел ваш коммент. По сути: нет потоки само не закрывает (по крайней мере на диске). Приходится в деструкторе объекта указывать close(), чтоб файл был на диске. В паскале проще: там можно не указывать закрытие, при выходе из проги само закроет.

Airhand
  • 206
  • 1
  • 7
  • 2
    Прошу пояснить, желательно с примерами кода. Использование потоков для взаимодействия с файлами автоматически закрывает их (файлы) при разрушении объекта. – awesoon May 03 '15 at 08:26