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 元素的數量,或為零 |
[編輯] 返回值
此物件
[編輯] 注意
此函式的使用條件以及所提供緩衝區的用法是實現定義的。
- 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> 的公共成員函式) | |
為檔案流設定緩衝區及其大小 (函式) |