会员std::ios::rdstate()
简单地返回状态标志的组合std::ios_base::badbit
, std::ios_base::eofbit
, and std::ios_base::failbit
。在哪些条件下设置哪些位并不完全一致,但其意图如下:
-
std::ios_base::badbit
当流真正处于功能失调状态并且您[可能]不会从中得到任何东西时,就会设置该值。例如,如果没有流缓冲区或流上的任何操作引发异常,则设置此标志。
-
std::ios_base::failbit
当输入操作失败时设置,例如,因为格式化输入操作获得了意外的字符。通过清除该错误、忽略几个字符并重试,也许可以从该错误中恢复。
-
std::ios_base::eofbit
当达到[当前] EOF 时(即暂时无法提取更多字符时)被设置。
现在,在您的情况下,您输入了一个字符串并成功读取它,即没有设置标志。请注意,阅读以换行符停止,即您确实输入了"test\n"
流提取了这五个字符。当您结束流时,流在尝试读取字符串时达到 EOF,即,它设置std::ios_base::eofbit
and输入失败也设置std::ios_base::failbit
.
如果你只想看std::ios_base::eofbit
设置,您可以通过使用以流末尾的单词结尾且没有任何后续空格字符的流来执行此操作。获得这样的流的一个简单方法是使用std::istringstream
并从中读出:
std::istringstream in("test");
Read(in);
另一个简单的设置是看std::ios_base::badbit
设置:您只需创建一个没有流缓冲区的流,例如:
std::istream in(0);
Read(in);
请注意,该流最初将具有std::ios_base::badbit
设置并获得std::ios_base::failbit
尝试读取字符时设置。后clear()
ing the std::ios_base::badbit
但仍将被设置。
To get std::ios_base::failbit
设置而不同时具有std::ios_base::eofbit
设置您需要防止它看到非空白字符:输入运算符std::string
默认情况下,开始时会跳过空格,然后读取,直到到达空格或 EOF,如果可以读取至少一个非空格字符,则说明成功。一种方法是关闭自动跳过空白,例如:
std::istringstream in("test test");
Read(in >> std::noskipws);
顺便说一句,请注意,不能保证以下值std::ios_base::eofbit
, std::ios_base::failbit
, or std::ios_base::badbit
除了它们可以以某种形式用作位掩码之外。