Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: setbuf

From cppreference.net
protected :
virtual std:: basic_streambuf < CharT, Traits > * setbuf ( char_type * s, std:: streamsize n )
**Примечание:** В данном фрагменте HTML-кода отсутствует текст для перевода, требующий локализации на русский язык. Весь представленный контент состоит из: - HTML-тегов и атрибутов (которые не подлежат переводу) - C++ ключевых слов и синтаксиса (`protected`, `virtual`, `setbuf` и т.д.) - Имен типов и функций C++ (`std::basic_streambuf`, `char_type`, `std::streamsize`) - Символов и операторов C++ (`:`, `*`, `<`, `>`, `(`, `)`) Все эти элементы сохранены в оригинальном виде в соответствии с требованиями.

Если 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> )
устанавливает буфер и его размер для файлового потока
(функция)