std::basic_istream<CharT,Traits>::sentry

從 cppreference.com
< cpp‎ | io‎ | basic istream
 
 
 
 
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

[編輯] 參閱

提取帶格式數據
(公開成員函數) [編輯]
提取字符和字符數組
(函數模板) [編輯]