Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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++ 如果我赢了';你不能清理小溪吗?_C++_Stringstream - Fatal编程技术网

C++ 如果我赢了';你不能清理小溪吗?

C++ 如果我赢了';你不能清理小溪吗?,c++,stringstream,C++,Stringstream,我在TopCoder中做了一个图形问题,不知何故,我的程序一直输出错误的答案,尽管我认为一切都应该正常。我花了好几个小时寻找我的逻辑中的错误,结果,问题出在其他地方。下面是一段我有疑问的代码: int x, y; stringstream ssx; stringstream ssy; for (int i = 0; i < connects.size(); i++){ neighbours.push_back(vector<int> ()); edges_cos

我在TopCoder中做了一个图形问题,不知何故,我的程序一直输出错误的答案,尽管我认为一切都应该正常。我花了好几个小时寻找我的逻辑中的错误,结果,问题出在其他地方。下面是一段我有疑问的代码:

int x, y;
stringstream ssx;
stringstream ssy;
for (int i = 0; i < connects.size(); i++){
    neighbours.push_back(vector<int> ());
    edges_cost.push_back(vector<int> ());
    ssx.str(connects[i]);
    ssy.str(costs[i]);
    while (ssx >> x && ssy >> y){
        neighbours[i].push_back(x);
        edges_cost[i].push_back(y);
    }
    // The problem lied here. Apparently without these 2 lines
    // the program outputs wrong answer. Why?
    ssx.clear();
    ssy.clear();
}
intx,y;
stringstream ssx;
细流;
对于(int i=0;i>x&&ssy>>y){
邻居[i]。推回(x);
边缘成本[i]。向后推(y);
}
//问题就在这里。显然没有这两条线
//程序输出了错误的答案。为什么?
ssx.clear();
ssy.clear();
}

正如你在评论中看到的,我设法解决了这个问题。但我不明白为什么我需要清除这些流。如果我不这样做,到底会发生什么?

一旦您从流中提取了所有数据并尝试读取“再多一个字符!”(对
int
的内置提取将尝试这样做,以确定是否有更多的数字要读取),其
eof
位被设置

您正在通过更改其缓冲区的“内容”来使用流,这很好,但您也需要重置
eof
位。这就是
.clear()
所做的

要在一般情况下重复使用stringstream,请执行以下操作:

ss.str("");  // clears data
ss.clear();  // clears all error flag bits
(在您的例子中,您直接用新数据替换缓冲区,稍后使用
.str(“newText!”)
,而不是编写
.str(“”
),这很好。)


这很令人困惑,因为像
clear
这样的函数听起来好像要清除数据,但实际上没有。

当您到达
while
循环的末尾时,eof位(或另一个错误位,取决于您的输入)被设置在流上,这会导致所有后续操作失败,除非您清除它。当然,正如目前所写的,流超出了范围,没有执行任何操作,所以我不明白这有什么关系。我想可能缺少一些相关的代码。@5gon12eder:代码清楚地设置了流缓冲区,并在每次循环迭代期间从中提取…@T.C.请不要在注释中写答案。这种行为目前似乎很流行,但它确实是一种反模式。评论是为了要求澄清和斥责他人。@LightnessRacesinOrbit您是对的-代表我分析错误。删除多余的缩进,以避免其他人犯同样的错误。