2012-06-10 1 views
1

Есть ли еще выходные буферы? Если да, делает ли endl только сброс выходного буфера, связанного с cout? Если есть только один буфер, то чем отличаются два объекта cerr и clog?Есть ли еще выходные буферы?

+0

Здесь [функция создания буфера для конкретного окна] (http://msdn.microsoft.ком/EN-US/библиотека/окна/настольные/ms682122 (v = vs.85) .aspx). Это похоже на наличие заднего буфера для рисования. В разделе замечаний объясняется цель. – chris

ответ

3

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», т.е. выключить буферизацию.

3

Ввод/вывод в 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, который обычно является стандартным потоком ошибок.

+1

Следует также отметить, что cin является 'tie()' -d '' cout' по умолчанию (и только ему, 'cerr' и' clog' не подключены к нему), поэтому чтение чего-либо из 'cin' автоматически сбрасывает 'cout'. –

+0

И есть также 'sync_with_stdio', который поддерживает' cin' в соответствии с 'stdin' и' cout' в соответствии с 'stdout' и т. Д., Заставляя их обмениваться буферами, но я думал, что ответ уже достаточно длинный! –

+0

Этого я не знал. Во всяком случае, кажется, что это также включено по умолчанию, правильно? –