std::basic_filebuf<CharT,Traits>:: setbuf
|
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'; }
可能的输出:
356010
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 173 | C++98 | n 的类型被错误指定为 int | 修正为 std::streamsize |
参见
|
调用
setbuf
(
)
(
std::basic_streambuf<CharT,Traits>
的公开成员函数)
|
|
|
设置文件流的缓冲区及其大小
(函数) |