std::basic_filebuf<CharT,Traits>::setbuf
protected: virtual std::basic_streambuf<CharT, Traits>* setbuf( char_type* s, std::streamsize n ) |
Если s является указателем на null и n равно нулю, буферизация для вывода файла отключается, что означает, что pbase() и pptr() равны null и любой вывод немедленно отправляется в файл.
В противном случае вызов setbuf() заменяет внутренний буфер (управляемую последовательность символов) на предоставленный пользователем массив символов, первый элемент которого указан s, и позволяет этому объекту std::basic_filebuf использовать до n байтов в этом массиве для буферизации.
Эта функция является защищенной виртуальной, она может вызываться только через pubsetbuf() или из функций-членов класса, определенного пользователем, производного от std::basic_filebuf.
Параметры
| s | - | указатель на первый CharT в предоставленном пользователем буфере или null |
| n | - | количество элементов CharT в предоставленном пользователем буфере или ноль |
Возвращаемое значение
this
Примечания
Условия использования этой функции и способ использования предоставленного буфера определяются реализацией.
- GCC 4.6 libstdc++
setbuf() может быть вызван только тогда, когда std::basic_filebuf не ассоциирован с файлом (иначе не имеет эффекта). При использовании буфера пользователя чтение из файла происходит n-1 байтов за раз. - Clang++3.0 libc++
setbuf() может быть вызван после открытия файла, но перед любым вводом-выводом (иначе может привести к ошибке). При использовании буфера пользователя чтение из файла происходит чтением наибольших кратных 4096, которые помещаются в буфер. - Visual Studio 2010
setbuf() может быть вызван в любое время, даже после выполнения некоторых операций ввода-вывода. Текущее содержимое буфера, если таковое имеется, теряется. Стандарт не определяет никакого поведения для этой функции, за исключением того, что setbuf(0, 0) вызывается до любой операции ввода-вывода, должна установить разблокированный вывод.
Пример
Предоставляет буфер размером 10 КБ для чтения. В Linux для наблюдения за фактическим количеством считанных байтов может использоваться утилита strace.
#include <fstream>
#include <iostream>
#include <string>
int main()
{
int cnt = 0;
std::ifstream file;
char buf[10241];
file.rdbuf()->pubsetbuf(buf, sizeof buf);
file.open("/usr/share/dict/words");
for (std::string line; getline(file, line);)
++cnt;
std::cout << cnt << '\n';
}Возможный вывод:
356010
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 173 | C++98 | тип n был ошибочно указан как int | исправлено на std::streamsize |
См. также
вызывает setbuf() (публичный член-функция std::basic_streambuf<CharT,Traits>) |
|
| устанавливает буфер и его размер для потока файла (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_filebuf/setbuf