Как отключить буферизацию в потоке?

В C я могу легко установить поток для небуферизованного ввода-вывода:

FILE * f = fopen( "test", "r" );
setvbuf( f, (char *)NULL, _IONBF, 0 );

Как я мог бы получить аналогично небуферизованный ввод-вывод с использованием IOS-потоков С++?

Ответы

Ответ 1

Для потоков файлов вы можете использовать pubsetbuf для этого:

std::ifstream f;
f.rdbuf()->pubsetbuf(0, 0);
f.open("test");


Объяснение

В стандарте С++ говорится о влиянии setbuf (и, следовательно, pubsetbuf) на файловые потоки:

Если setbuf(0,0) вызывается в потоке до того, как какой-либо ввод-вывод произошел в этом потоке, поток становится небуферизованным. В противном случае результаты определяются реализацией. "Без буферизации" означает, что pbase() и pptr() всегда возвращают значение null, а вывод в файл должен появляться как можно скорее.

Первое предложение гарантирует, что приведенный выше код делает поток небуферизованным. Обратите внимание, что некоторые компиляторы (например, gcc) видят открытие файла в качестве операции ввода-вывода в потоке, поэтому перед открытием файла следует вызывать pubsetbuf. (Как указано выше).

Последнее предложение, однако, похоже, подразумевает, что это будет только для вывода, а не для ввода. Я не уверен, что это был надзор, или это было предназначено. Консультирование вашей документации компилятора может оказаться полезным. Например, для gcc, как входные, так и выходные данные небуферируются (см. Руководство по библиотеке GNU С++ - Буферы потоков).