Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
该stl运算符是否>&燃气轮机;功能使魔法发生? 当我测试C++ STL特性时,我遇到了一个奇怪的问题。_C++_Loops_Eof_Istream_Istringstream - Fatal编程技术网

该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)