名稱空間
變體
操作

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> 的公共成員函式) [編輯]
為檔案流設定緩衝區及其大小
(函式) [編輯]