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
в предоставленном пользователем буфере или 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 ) вызванная до выполнения любых операций ввода-вывода должна установить небуферизованный вывод.
Пример
Предоставляет буфер размером 10k для чтения. В 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>
)
|
|
|
устанавливает буфер и его размер для файлового потока
(функция) |