Есть ли еще выходные буферы? Если да, делает ли endl
только сброс выходного буфера, связанного с cout
? Если есть только один буфер, то чем отличаются два объекта cerr
и clog
?Есть ли еще выходные буферы?
ответ
endl
очищает выходной буфер от того потока, в который вы его передаете. Например:
cout << ... << endl; // flushes the output buffer of 'cout'
cerr << ... << endl; // flushes the output buffer of 'cerr'
ofstream file("filename");
file << ... << endl; // flushes the output buffer of 'file'
Единственное различие между cerr
и clog
что clog
буферизуется по умолчанию, в то время как cerr
нет. Вы можете включить или выключить буферизацию для любого потока с помощью манипуляторов std::unitbuf
и std::nounitbuf
. Например:
cerr << nounitbuf; // cerr is now buffered
clog << unitbuf; // clog is now unbuffered
Обратите внимание, что «unitbuf» означает «сделать размер буфера 1», т.е. выключить буферизацию.
Ввод/вывод в C (и среда UNIX, с которой он возник) осуществляется через данные «потоки», которые представляют собой абстрактные последовательности байтов, которые могут быть прочитаны или записаны в (или и те, и другие), например файлы в файловой системе, или устройства, такие как терминал (или экран и клавиатура).
Заголовок стандартной библиотеки C <stdio.h>
объявляет тип FILE
, который служит в качестве дескриптора потока данных. Он также объявляет stdin
, stdout
и stderr
с типом FILE*
, чтобы ссылаться на стандартный поток ввода, стандартный выходной поток и стандартный поток ошибок соответственно.
стандартной библиотеки C++ определяет std::istream
и std::ostream
классы (все вместе называемые iostreams), которые могут быть использованы для взаимодействия с потоками данных (терминология немного сбивает с толку, так как C++ iostreams классы иногда называют просто «потоков», но тот же самый слово также означает абстрактный поток данных, что <stdio.h>
File` относится к.)
C++ глобального std::istream
объекта std::cin
связан со стандартными входным потоком (то есть тот же поток, как stdin
относится к,) глобальному std::ostream
объекта std::cout
является связанный со стандартным потоком вывода, и глобальный объект s std::cerr
и std::clog
- это разные объекты, но оба они связаны со стандартным потоком ошибок.
Разница между cerr
и clog
является то, что по умолчанию clog
использует streambuf, который хранит символы, записанные в ней во внутреннем буфере, и только записывает эти данные в стандартный поток ошибок, когда буфер заполняется или когда явно продувают, тогда как cerr
В streambuf отсутствует внутренняя буферизация, поэтому все записывается прямо в стандартный поток ошибок. Поскольку они являются отдельными объектами, у них есть отдельные streambufs с различным поведением по умолчанию, но в конечном итоге они записываются в один и тот же стандартный поток ошибок.
std::endl
может быть записан в любой std::ostream
, так что если вы пишете std::cout << std::endl
он смоет поток, связанный с cout
, который, как правило, стандартным выходным потоком. если вы напишете std::clog << std::endl
, он будет очищать поток, связанный с clog
, который обычно является стандартным потоком ошибок.
Следует также отметить, что cin является 'tie()' -d '' cout' по умолчанию (и только ему, 'cerr' и' clog' не подключены к нему), поэтому чтение чего-либо из 'cin' автоматически сбрасывает 'cout'. –
И есть также 'sync_with_stdio', который поддерживает' cin' в соответствии с 'stdin' и' cout' в соответствии с 'stdout' и т. Д., Заставляя их обмениваться буферами, но я думал, что ответ уже достаточно длинный! –
Этого я не знал. Во всяком случае, кажется, что это также включено по умолчанию, правильно? –
Здесь [функция создания буфера для конкретного окна] (http://msdn.microsoft.ком/EN-US/библиотека/окна/настольные/ms682122 (v = vs.85) .aspx). Это похоже на наличие заднего буфера для рисования. В разделе замечаний объясняется цель. – chris