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 )

如果 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() 可在打开文件后调用,但必须在任何I/O操作之前(否则可能导致崩溃)。使用用户提供的缓冲区时,从文件读取的数据量会是缓冲区容量内最大的4096倍数。
  • Visual Studio 2010
setbuf() 可以在任意时刻调用,即使已经发生了一些 I/O 操作。缓冲区当前的内容(如果有的话)将会丢失。

标准未定义此函数的任何行为,但要求在发生任何I/O操作前调用 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++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 173 C++98 n 的类型被错误指定为 int 修正为 std::streamsize

参见

调用 setbuf ( )
std::basic_streambuf<CharT,Traits> 的公开成员函数)
设置文件流的缓冲区及其大小
(函数)