Spec-Zone.ru › C++

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

См. также

pubsetbuf
вызывает setbuf()
(открытая функция-член std::basic_streambuf<CharT,Traits>)
setvbuf
задаёт буфер и его размер для файлового потока
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_filebuf/setbuf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API