Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在getline上检查eof(),即while(!getline().eof())和只在while(getline())上检查有什么区别_C++_Delimiter_Eof_Getline - Fatal编程技术网

C++ 在getline上检查eof(),即while(!getline().eof())和只在while(getline())上检查有什么区别

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

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<<"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:Not
getline()
正在检查
getline()
返回对流的引用<代码>while()
需要一个布尔值。将流引用计算为布尔值将调用该流上的
.operator bool()
。如果
,这将是正确的!失败比特&!badbit
。与此相反,
!(/*stream*/).eof()
如果
,则为true!eofbit
while(getline(inpStrStream, tempStr, '='))