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> 的公开成员函数) | |
为文件流设置缓冲区与其大小 (函数) |