Ответ 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 С++ - Буферы потоков).