std::basic_istream<CharT,Traits>::sentry
class sentry; |
||
在每個執行輸入(有格式和無格式)的 std::basic_istream 成員函數起始,在塊作用域構造一個類 basic_istream::sentry
的對象。其構造函數準備輸入流:檢查流是否已在失敗狀態,沖入 tie()
過的輸出流,若非設置了 noskipws 標誌則跳過前導空白,並在需要時進行其他由實現定義的任務。如果必要則在析構函數中進行所有清理,從而在輸入過程中拋出異常的情況下保證清理髮生。
目錄 |
[編輯] 成員類型
traits_type
|
Traits
|
[編輯] 成員函數
(構造函數) |
構造 sentry 對象。在此完成所有準備任務。 (公開成員函數) |
(析構函數) |
若需要,則在有格式輸入或異常後終止流對象 (公開成員函數) |
operator= [棄置] |
不可複製賦值 (公開成員函數) |
operator bool |
檢查流對象的準備是否成功 (公開成員函數) |
std::basic_istream::sentry::sentry
explicit sentry(std::basic_istream<CharT, Traits>& is, bool noskipws = false); |
||
為有格式輸入準備流。
如果 is.good() 是 false,那麼調用 is.setstate(std::ios_base::failbit) 並返回。否則,如果 is.tie() 不是空指針,那麼調用 is.tie()->flush() 將輸出序列與外部流同步。is.tie() 的放置區為空時可以抑制此調用。實現可以延遲對 flush() 的調用,直到發生對 is.rdbuf()->underflow() 的調用。如果在銷毀 sentry 對象前未出現這種調用,那麼它可以被完全消除。
如果 noskipws 為零且 is.flags() & std::ios_base::skipws 不為零,那麼函數提取並捨棄所有空白字符,直到下個可用字符不是空白字符(由當前 is 中浸染的本地環境確定)。如果 is.rdbuf()->sbumpc() 或 is.rdbuf()->sgetc() 返回 traits::eof(),那麼此函數調用 setstate(std::ios_base::failbit | std::ios_base::eofbit)(可能會拋出 std::ios_base::failure)。
可能會發生由實現定義的其他準備,其可能會調用 setstate(std::ios_base::failbit)(可能會拋出 std::ios_base::failure)。
如果準備完成後 is.good() == true,那麼對 operator bool 的任何後繼調用都會返回 true。
參數
is | - | 要準備的文件流 |
noskipws | - | 不應跳過空白時是 true |
異常
在跳過空白符且出現文件尾條件時拋出 std::ios_base::failure。
std::basic_istream::sentry::~sentry
~sentry(); |
||
不做任何事。
std::basic_istream::sentry::operator bool
explicit operator bool() const; |
||
檢查輸入流準備是否成功。
參數
(無)
返回值
輸入流初始化成功時返回 true,否則返回 false。
[編輯] 示例
#include <iostream> #include <sstream> struct Foo { char n[5]; }; std::istream& operator>>(std::istream& is, Foo& f) { std::istream::sentry s(is); if (s) is.read(f.n, 5); return is; } int main() { std::string input = " abcde"; std::istringstream stream(input); Foo f; stream >> f; std::cout.write(f.n, 5); std::cout << '\n'; }
輸出:
abcde
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 出版時的行為 | 正確行為 |
---|---|---|---|
LWG 195 | C++98 | 不明確構造函數是否會設置 eofbit
|
使之明確 |
LWG 419 | C++98 | 構造函數在已設置 eofbit 的情況下不會設置
|
此時會設置 failbit
|
[編輯] 參閱
提取帶格式數據 (公開成員函數) | |
提取字符和字符數組 (函數模板) |