std::basic_filebuf<CharT,Traits>::setbuf
protected: virtual std::basic_streambuf<CharT, Traits>* setbuf( char_type* s, std::streamsize n ) |
Если s является нулевым указателем, а n равно нулю, для вывода в filebuf отключается буферизация: это означает, что pbase() и pptr() являются нулевыми, а любые выводимые данные немедленно отправляются в файл.
В противном случае вызов setbuf() заменяет внутренний буфер (управляемую последовательность символов) предоставленным пользователем массивом символов, на первый элемент которого указывает s, и позволяет этому объекту std::basic_filebuf использовать для буферизации до n байт из этого массива.
Эта функция является защищённой виртуальной функцией; её можно вызвать только через pubsetbuf() или из функций-членов определённого пользователем класса, производного от std::basic_filebuf.
Параметры
| s | - | указатель на первый CharT в предоставленном пользователем буфере или нулевой указатель |
| 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++.
| Отчёт об ошибке | Применяется к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| 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/cpp/io/basic_filebuf/setbuf