std::setbuf
Определён в заголовочном файле <cstdio> | ||
|---|---|---|
void setbuf( std::FILE* stream, char* buffer ); |
Устанавливает внутренний буфер для операций ввода-вывода, выполняемых над потоком C stream.
Если buffer не равен null, эквивалентно std::setvbuf(stream, buffer, _IOFBF, BUFSIZ).
Если buffer равен null, эквивалентно std::setvbuf(stream, nullptr, _IONBF, 0), что отключает буферизацию.
Параметры
| stream | - | файловый поток, для которого устанавливается буфер |
| buffer | - | указатель на буфер, используемый потоком. Если передан нулевой указатель, буферизация отключается. Если указатель не равен null, диапазон [buffer, buffer + BUFSIZ) должен быть допустимым |
Примечания
Если BUFSIZ не соответствует требуемому размеру буфера, для его изменения можно использовать std::setvbuf.
Для обнаружения ошибок также следует использовать std::setvbuf, поскольку std::setbuf не указывает на успех или неудачу.
Эту функцию можно использовать только после того, как stream будет связан с открытым файлом, но до выполнения любых других операций (кроме неудачного вызова std::setbuf/std::setvbuf).
Распространённая ошибка — установить для stdin или stdout буфер в виде массива, время жизни которого заканчивается до завершения программы:
int main()
{
char buf[BUFSIZ];
std::setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
Пример
std::setbuf можно использовать для отключения буферизации в потоках, где требуется немедленный вывод.
#include <chrono>
#include <cstdio>
#include <thread>
int main()
{
using namespace std::chrono_literals;
std::setbuf(stdout, nullptr); // unbuffered stdout
std::putchar('a'); // appears immediately on unbuffered stream
std::this_thread::sleep_for(1s);
std::putchar('b');
}
Вывод:
ab
См. также
| устанавливает буфер и его размер для файлового потока (функция) |
|
Документация C для setbuf |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/setbuf