该stl运算符是否>&燃气轮机;功能使魔法发生? 当我测试C++ STL特性时,我遇到了一个奇怪的问题。
如果我取消注释行该stl运算符是否>&燃气轮机;功能使魔法发生? 当我测试C++ STL特性时,我遇到了一个奇怪的问题。,c++,loops,eof,istream,istringstream,C++,Loops,Eof,Istream,Istringstream,如果我取消注释行If(eee),我的while循环将永远不会退出 我在64位Windows下使用vs2015 inti=0; istream&mystream=data.getline(mycharstr,128); size_t mycount=data.gcount(); 字符串str(mycharstr,mycharstr+mycount); istringstream myinput(str); 单词myfunclist[9]={0}; 对于每个(myfunclist,myfunclis
If(eee)
,我的while
循环将永远不会退出
我在64位Windows下使用vs2015
inti=0;
istream&mystream=data.getline(mycharstr,128);
size_t mycount=data.gcount();
字符串str(mycharstr,mycharstr+mycount);
istringstream myinput(str);
单词myfunclist[9]={0};
对于每个(myfunclist,myfunclist+9,[](WORD&i){i=UINT_MAX;});
被调用集被调用集;
callee_set.clear();
bool failbit=myinput.fail();
bool eof=myinput.eof();
而(!failbit&&!eof)
{
int eee=myinput.peek();
如果(EOF==eee)中断;
//if(eee)//如果我取消注释此行,failbit和eof将始终为false,因此循环将永远不会退出。
{
myinput>>myfunclist[i++];
}
//否则就断了;
failbit=myinput.fail();
eof=myinput.eof();
我想是吧
int eee = myinput.peek();
在某个点返回零
那么由于
if (eee)
你停止从溪流中阅读,永远无法到达EOF
尽力
if (eee >= 0)
反而
作为替代方案,您可以:
if (eee < 0)
{
break;
}
// No need for further check of eee - just do the read
myinput >> myfunclist[i++];
if(eee<0)
{
打破
}
//无需进一步检查eee-只需读取
myinput>>myfunclist[i++];
问题的根本原因是对流设置其标志的方式存在误解:fail()
和eof()
仅在读取操作失败或到达最后一个字节后尝试读取时设置
P> >用C++流,你可以完全读入你的输入的最后一个字节,并在文件的末尾,但是<代码> EFF()/Cyp>将一直保持错误,直到你尝试多读。你会在StAdExver上找到关于为什么的问题和答案。
后果:
- 您将始终进入循环,即使在
myinput
中没有可读取的字符
- 因此,您必须检查
peek()
返回EOF
的特殊情况
- 如果在偷看之后仍在循环中,则仍有字符需要读取。请记住,这不会消耗字符。如果您没有以正确的方式读取,则会在流中停留在相同的位置。因此,如果出于任何原因,您没有到达
myinput>>myfunclist[i++];
,您陷入了一个无休止的循环中,不断地一次又一次地偷看同一个字符。这就是0的情况,在中有很好的描述:它仍然在那里,您不会在流中前进
其他意见:
- 由于您的输入可以是128字节长,并且您在文本编码中读取整数,因此您可能有64个不同单词的邪恶输入,从而导致循环超出ov界限,并导致例如内存损坏
- 不清楚你为什么要偷看
我建议忘记标志,使用通常的流读取习惯用法,并将代码简化为:
...
callee_set.clear(); // until there, no change
while (i<9 && myinput >> myfunclist[i++])
{
cout << myinput.rdstate() << endl; // if you really want to know ;-)
}
。。。
callee_set.clear();//在此之前,不进行任何更改
而(i>myfunclist[i++]
{
cout@Christophe-这怎么可能是一个完全重复的语句?它看起来非常不同,因为使用了peek
和fail
。此外,问题是关于与EOF无关的if语句。@4386427你是对的,它不是一个完全重复的语句。我重新打开Eddennis,你能解释一下这与标准模板库的关系吗(STL)?@Christophe long time…嗯..我想istringstream是用STL在后台实现的。我想知道运算符非常感谢。此外,当遇到istringstream中的\r\n时,它确实返回零,我使用这个if语句,因为xcode下的同一代码有一个额外的0输出到myfunclist,这很奇怪…xcode的STL版本在上与$ms visual studio有不同的行为。在vs下运行此代码时,即使我不使用此if语句,0也不会输出到funclist。(xcode版本为7.3)