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 元素的数量,或为零 |
[编辑] 返回值
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++ 标准。
DR | 应用于 | 已发布的行为 | 正确的行为 |
---|---|---|---|
LWG 173 | C++98 | n 的类型被错误地指定为 int | 更正为 std::streamsize |
[编辑] 参见
调用 setbuf() ( std::basic_streambuf<CharT,Traits> 的公共成员函数) | |
为文件流设置缓冲区及其大小 (函数) |