命名空间
变体
操作

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

来自 cppreference.cn
< 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 元素的数量,或为零

[编辑] 返回值

此对象

[编辑] 注意

此函数的使用条件以及所提供缓冲区的用法是实现定义的。

  • 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> 的公共成员函数) [编辑]
为文件流设置缓冲区及其大小
(函数) [编辑]