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

< cpp‎ | io‎ | basic filebuf
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';
}


参阅

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