istream& Read(istream &is)
{
std::string buf;
while (is >> buf)
{
cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
cout << is.rdstate() << endl;
cout << buf << endl;
}
cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
cout << is.rdstate() << endl;
is.clear();
cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
cout << is.rdstate() << endl;
return is;
}
Run Code Online (Sandbox Code Playgroud)
如果我输入普通字符如"test",则输出为1 2 4 0
.
然后我键入CTRL + Z(窗口),输出为1 2 4 3
1 2 4 0
.
问题:1.rdstate()
返回值是什么意思?(为什么它输出3,而不是2?不是1?)
is.eofbit
和is.failbit
改变我输入CTRL + Z之后?(正如C++ Primer 5th Editon所说,达到文件结尾设置了eofbit和failbit) 该成员仅返回状态标志、和std::ios::rdstate()
的组合。在哪些条件下设置哪些位并不完全一致,但其意图如下:std::ios_base::badbit
std::ios_base::eofbit
std::ios_base::failbit
std::ios_base::badbit
当流真正处于功能失调状态并且您[可能]不会从中得到任何东西时,就会被设置。例如,如果没有流缓冲区或者流上的任何操作抛出异常,则设置此标志。std::ios_base::failbit
当输入操作失败时设置,例如,因为格式化输入操作获得了意外的字符。通过清除该错误、忽略几个字符并重试,也许可以从该错误中恢复。std::ios_base::eofbit
当达到[当前] EOF 时(即暂时无法提取更多字符时)被设置。现在,在您的情况下,您输入了一个字符串并成功读取它,即没有设置标志。请注意,读取以换行符停止,即您真正输入"test\n"
并且流提取了这五个字符。当您结束流时,流在尝试读取字符串时达到 EOF,即它设置std::ios_base::eofbit
并且输入失败也设置std::ios_base::failbit
。
如果您只想查看std::ios_base::eofbit
集合,可以使用一个流来实现,该流以流末尾的单词结尾,后面不带任何空格字符。获取此类流的一种简单方法是使用std::istringstream
并从中读取:
std::istringstream in("test");
Read(in);
Run Code Online (Sandbox Code Playgroud)
另一个简单的设置是查看std::ios_base::badbit
设置:您只需创建一个没有流缓冲区的流,例如:
std::istream in(0);
Read(in);
Run Code Online (Sandbox Code Playgroud)
请注意,流最初将被std::ios_base::badbit
设置,并且std::ios_base::failbit
在尝试读取字符时也会被设置。clear()
不过,在ing之后std::ios_base::badbit
,仍然会被设置。
要在std::ios_base::failbit
没有设置的情况下进行设置,std::ios_base::eofbit
您需要防止它看到非空白字符:std::string
默认情况下,输入运算符 for 开始跳过空白,然后读取直到到达空白或 EOF,如果可以读取则成功至少一个非空白字符。一种方法是关闭自动跳过空白,例如:
std::istringstream in("test test");
Read(in >> std::noskipws);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,请注意,除了可以以某种形式用作位掩码之外,不保证std::ios_base::eofbit
、std::ios_base::failbit
或的值。std::ios_base::badbit
归档时间: |
|
查看次数: |
4199 次 |
最近记录: |