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