std::basic_istream<CharT,Traits>::sync
From cppreference.com
< cpp | io | basic istream
| int sync(); |
||
関連するデータソースと入力バッファを同期します。
UnformattedInputFunction と同様に動作しますが、gcount() は影響を受けません。セントリーオブジェクトを構築してチェックした後、
rdbuf() がヌルポインターの場合、-1 を返します。
それ以外の場合、rdbuf()->pubsync() を呼び出します。その関数が -1 を返した場合、setstate(badbit) を呼び出して -1 を返します。それ以外の場合は、0 を返します。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
成功した場合は 0、失敗した場合やストリームがこの操作をサポートしない場合(バッファリングされていない場合)は -1。
[編集] 注記
readsome() と同様に、ライブラリ提供のストリームに対してこの関数が何らかの動作を行うかどうかは実装定義です。意図としては、次の読み込み操作で、ストリームバッファが最後に取得領域を埋めた後に、関連する入力シーケンスに加えられた可能性のある変更を取り込むことです。これを実現するために、sync() は取得領域を空にするか、再充填するか、あるいは何も行わない場合があります。特筆すべき例外として Visual Studio があり、標準入力ストリームに対してこの操作を呼び出すと、未処理の入力が破棄されます。
[編集] 例
ファイル入力における入力ストリーム sync() の使用法を示します。読み込みに対する std::basic_filebuf::sync の呼び出しは実装定義であるため、ここでの出力も実装定義です。
このコードを実行
#include <fstream> #include <iostream> void file_abc() { std::ofstream f("test.txt"); f << "abc\n"; } void file_123() { std::ofstream f("test.txt"); f << "123\n"; } int main() { file_abc(); // file now contains "abc" std::ifstream f("test.txt"); std::cout << "Reading from the file\n"; char c; f >> c; std::cout << c; file_123(); // file now contains "123" f >> c; std::cout << c; f >> c; std::cout << c << '\n'; f.close(); file_abc(); // file now contains "abc" f.open("test.txt"); std::cout << "Reading from the file, with sync()\n"; f >> c; std::cout << c; file_123(); // file now contains "123" f.sync(); f >> c; std::cout << c; f >> c; std::cout << c << '\n'; }
実行結果の例
Reading from the file abc Reading from the file, with sync() a23
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 62 | C++98 | rdbuf()->pubsync() が -1 を返した場合、sync() は traits::eof() を返していました。 |
この場合、-1 を返します。 |
[編集] 関連項目
| [virtual] |
バッファを関連付けられた文字シーケンスと同期する ( std::basic_streambuf<CharT,Traits> の仮想 protected メンバ関数) |
| 基礎となるストレージデバイスと同期する ( std::basic_ostream<CharT,Traits> の public メンバ関数) |