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 является указателем на 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

См. также

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/w/cpp/io/basic_filebuf/setbuf

Spec-Zone.ru

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