gpt4 book ai didi

c++ - 在 getline 上检查 eof() 有什么区别,即 while(!getline().eof()) 和简单地检查 while(getline())

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:38 27 4
gpt4 key购买 nike

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;
}

我预计两者的结果相同,但“Ex A”和“Ex B”的结果不同。我在“Ex B”的输出中没有看到字符串“ABC”:

Ex A 结果:你好:CN测试,欧XYZ,O美国广播公司

Ex B 结果:你好:CN测试,欧XYZ, O

最佳答案

引用:CppReference.com, "iostate"

getline() 返回它正在操作的流的引用,即 inpStrStream

inpStrStream.operator bool()(或 while ( inpStrStream )/while ( getline( inpStrStream, tempStr, '=' ) ) ) 将检查是否设置了流的 failbitbadbit

! inpStrStream.eof() 将检查是否设置了流的 eofbit。 (*)

Cpp引用状态,

...in nearly all situations, if eofbit is set, failbit is set as well.

您在这里遇到了一个异常(exception)。 .operator!() 检查 failbit eofbit -- getline() "ABC" 确实设置了 eofbit(当到达流的 EOF 时),但不是 failbit(因为上次操作仍然成功)。这使得 .eof() 结束循环(不打印 "ABC"),而 .operator!() 将再执行一次迭代(打印 "ABC"),尝试另一个 getline(),失败(因为没有更多内容可读),设置 failbit,然后结束循环。

所以... .eof()显式测试 EOF ,即即使发生了一些令人讨厌的事情也会尝试继续到确实设置了其他两个标志之一的基础流。


(*):注意还有更多的测试。唯一对称的是 .fail().operator!()(它们测试相同的东西),以及它们的对称相反 .operator bool()。其他的 -- .good().bad().eof() -- 分别检查不同的东西!

关于c++ - 在 getline 上检查 eof() 有什么区别,即 while(!getline().eof()) 和简单地检查 while(getline()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56853719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com