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

来自cppreference.com
< 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() 可以在打开文件后,但要在任何输入/输出前调用(否则可能会崩溃)。拥有用户提供缓冲区时,从文件读取适合缓冲区的 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';
}

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 173 C++98 n 的类型被误指定为 int 改成 std::streamsize

参阅

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