2014-10-02 171 views
1

这是以下代码应该做的事情。它应该读取已被用户输入到int中的流(称为lineStream)中的信息。数据要么是一个单一的数字,要么是“全部”。如果它不是,我应该通知用户这是一个错误。为什么我的stringstream为空?

虽然这是会发生的事情:当用户输入数字时,一切正常。当他输入单词“all”时,流失败(因为我正在将它读入int)。当发生这种情况时,我尝试将流中的信息读入一个字符串(“stringstream”)并检查用户是否输入了“all”。但是,即使用户输入“全部”,当我尝试从失败后读取它时,流只输出“”(空字符串)。有谁知道为什么?谢谢。

int nameofnode; 

lineStream >> nameofnode; 

if (lineStream.fail()) 
{ 
    string streamString; 
    lineStream >> streamString; 

    if (streamString == "all") { 

     if (lineStream.peek() != EOF) { //Too many arguments 
      cout << "Error: too many arguments\n"; 
      return; 
     } 

     cout << "Print: all nodes\n"; 
    } 
    else 
    { 
     cout << "Error: Invalid argument"; 
    } 

    return; 
} 
+2

流仍处于失败状态,在重试提取字符串而不是-int提取字符串之前,您从未清除该字符串。 – WhozCraig 2014-10-02 02:32:58

+0

@WhozCraig如果流处于失败状态,这是否意味着我无法读取它?我认为这只是意味着我不能使用它的任何功能。 – dfg 2014-10-02 02:33:44

+2

直到失败状态被清除,你不能用iostream做很多*任何事情。如果不是“使用它的任何功能”,你认为“从中读取”是什么?提取'operator >>'只是使用流成员从流中提取格式化数据的前端。很确定,在你的字符串尝试之前,你正在寻找调用[** clear()**](http://en.cppreference.com/w/cpp/io/basic_ios/clear)的方法。 – WhozCraig 2014-10-02 02:36:20

回答

2

一旦进入失败状态,就可以无所事事地用iostream进行处理,而无需以某种方式清除失败状态。在这种情况下..

int nameofnode; 

if (!(lineStream >> nameofnode)) 
{ 
    lineStream.clear(); // <<==== HERE 

    string streamString; 
    if (lineStream >> streamString && streamString == "all") { 

     if (lineStream.peek() != EOF) { //Too many arguments 
      cout << "Error: too many arguments\n"; 
      return; 
     } 

     cout << "Print: all nodes\n"; 
    } 
    else 
    { 
     cout << "Error: Invalid argument"; 
    } 

    return; 
} 
+0

感谢您的帮助 – dfg 2014-10-02 02:46:35