C++ 在getline上检查eof(),即while(!getline().eof())和只在while(getline())上检查有什么区别
while(getline())和while(!getline().eof())之间有什么区别 我正在分析输入字符串。 我尝试了两种情况检查,我看到了结果的差异C++ 在getline上检查eof(),即while(!getline().eof())和只在while(getline())上检查有什么区别,c++,delimiter,eof,getline,C++,Delimiter,Eof,Getline,while(getline())和while(!getline().eof())之间有什么区别 我正在分析输入字符串。 我尝试了两种情况检查,我看到了结果的差异 std::string testStr = "CN=Test, OU=XYZ, O=ABC"; std::stringstream inpStrStream(testStr); std::string tempStr; getline(inpStrStream, tempStr, '='); std::cout<<"Hell
std::string testStr = "CN=Test, OU=XYZ, O=ABC";
std::stringstream inpStrStream(testStr);
std::string tempStr;
getline(inpStrStream, tempStr, '=');
std::cout<<"Hello:"<<tempStr<<std::endl;
//Let's call this as "Ex A"
while(getline(inpStrStream, tempStr, '='))
{
std::cout<<tempStr<<std::endl;
}
(OR)
//Let's call this as "Ex B"
while(!getline(inpStrStream, tempStr, '=').eof())
{
std::cout<<tempStr<<std::endl;
}
std::string testStr=“CN=Test,OU=XYZ,O=ABC”;
std::stringstream inpStrStream(testStr);
std::字符串tempStr;
getline(inpStrStream,tempStr,'=');
标准::coutRef:
getline()
返回它正在操作的流的引用,即inpStrStream
inpStrStream.operator bool()
!inpStrStream.eof()
将检查流的eofbit
是否已设置。(*)
参考国
…在几乎所有情况下,如果设置了eofbit
,则也会设置failbit
您在这里遇到了一个例外<代码>操作员!()
检查故障位
,不检查故障位
检查故障位
——ant的getline()
设置了故障位
(当到达流的EOF时),但未设置故障位
(因为最后一次操作仍然成功)。这使得.eof()
结束循环(不打印“ABC”
),而.operator!()
将再进行一次迭代(打印“ABC”
),尝试另一次getline()
,但失败(因为没有更多内容可读取),设置failbit
,并结束循环
所以.eof()
将仅显式测试eof,即,即使底层流发生了不愉快的事情,并且设置了其他两个标志之一,也将尝试继续
(*):注意还有更多的测试。唯一对称的是.fail()
和运算符!()
(测试相同的东西),以及它们的对称对立面。运算符bool()
。其他的--.good()
,.bad()
,和.eof()
--分别检查不同的东西 看看这个简单的测试代码:
#define LOG(x)std::cout类std::stringstream
继承定义运算符的类std::basic_ios
explicit operator bool() const;
那
1返回:!失败()
此运算符用于while语句的条件
while(getline(inpStrStream, tempStr, '='))
将调用std::getline
返回的对象上下文转换为bool类型
<> >从C++标准(C++ 17, 7标准转换)< /P>
4某些语言构造要求转换表达式
设置为布尔值。在这种上下文中出现的表达式e是
据说在上下文中转换为bool,如果且
仅当声明bool t(e)时;对一些人来说,这是一个很好的形式
临时变量t(11.6)
一个检查所有错误,另一个检查特定错误:尝试读取超出文件大小的内容。在成功地将ABC
解析到tempStr
后,“exb”退出循环,但由于EOF被触发,因此不会打印最后的解析结果。“while.operator!()将再执行一次迭代(打印“ABC”)”-对于Ex B,这种说法令人困惑,因为我们没有看到ABC打印出来。@Pravinkumar:我们没有看到Ex.B打印出来的ABC,因为它不是inpStrStream.operator!()
(如例A所示),但对inpStrStream.eof()
的否定。因此,我的理解是getline()检查流的failbit或badbit是否已设置,并且由于未设置,所以它打印ABC,而getline()则打印。eof检查遇到的eof,因为遇到了eof,所以它返回true&因此!true为false,因此while条件存在???@Pravinkumar:对不起,它不是运算符!()
,它是操作员bool()
。我的错。同样的道理。@Pravinkumar:Notgetline()
正在检查getline()
返回对流的引用<代码>while()
需要一个布尔值。将流引用计算为布尔值将调用该流上的.operator bool()
。如果,这将是正确的!失败比特&!badbit
。与此相反,!(/*stream*/).eof()
如果,则为true!eofbit
。
while(getline(inpStrStream, tempStr, '='))