为什么 stringstream 停止接收字符串? [C++]
Why does stringstream stop receiving strings? [C++]
我正在尝试实现一种从文本文件读取输入以更轻松地加载不同坐标集的方法,但我遇到了一个我不明白的错误,我的 stringstream
对象在哪里一旦其中一行格式错误,将停止接收字符串。
在我的输出中,您可以看到字符串在打印出来时仍然完好无损,然后在下一行将其放入stringstream
中,但是在一个格式错误的字符串之后,stringstream
当我打印出来时不再包含任何内容。
这是怎么回事?
输出:
这是文本文件的样子:
方法代码:
ifstream pathfile(p.string());
cout << "Path file opened successfully.\n\n";
string line;
stringstream ss;
int x, y;
char comma,direction;
//Iterate all lines in the file
while(getline(pathfile,line)){
//remove all spaces from line
line.erase(remove(line.begin(), line.end(), ' '), line.end());
//skip comments and blank lines
if(line.c_str()[0] == '#' || line.empty()) continue;
//parse remaining lines
ss.str(string()); //clear stringstream
cout <<"LINE: "<<line<<endl;
ss << line;
cout <<"SS: "<<ss.str()<<endl;
if(ss >> x >> comma >> y >> comma >> direction)
cout << "X: "<<x<<" Y: "<<y<<" D: "<<direction;
else{
cout << "Ill-formatted line: ";
}
printf(" | %s\n\n", line.c_str());
}
pathfile.close();
由于流在读取整数失败时进入错误状态,因此您需要清除错误状态。为此:
ss.clear();
更简单的方法是将字符串流的定义移到循环中:
istringstream ss(line);
if(ss >> x >> comma >> y >> comma >> direction)
// ...
我正在尝试实现一种从文本文件读取输入以更轻松地加载不同坐标集的方法,但我遇到了一个我不明白的错误,我的 stringstream
对象在哪里一旦其中一行格式错误,将停止接收字符串。
在我的输出中,您可以看到字符串在打印出来时仍然完好无损,然后在下一行将其放入stringstream
中,但是在一个格式错误的字符串之后,stringstream
当我打印出来时不再包含任何内容。
这是怎么回事?
输出:
这是文本文件的样子:
方法代码:
ifstream pathfile(p.string());
cout << "Path file opened successfully.\n\n";
string line;
stringstream ss;
int x, y;
char comma,direction;
//Iterate all lines in the file
while(getline(pathfile,line)){
//remove all spaces from line
line.erase(remove(line.begin(), line.end(), ' '), line.end());
//skip comments and blank lines
if(line.c_str()[0] == '#' || line.empty()) continue;
//parse remaining lines
ss.str(string()); //clear stringstream
cout <<"LINE: "<<line<<endl;
ss << line;
cout <<"SS: "<<ss.str()<<endl;
if(ss >> x >> comma >> y >> comma >> direction)
cout << "X: "<<x<<" Y: "<<y<<" D: "<<direction;
else{
cout << "Ill-formatted line: ";
}
printf(" | %s\n\n", line.c_str());
}
pathfile.close();
由于流在读取整数失败时进入错误状态,因此您需要清除错误状态。为此:
ss.clear();
更简单的方法是将字符串流的定义移到循环中:
istringstream ss(line);
if(ss >> x >> comma >> y >> comma >> direction)
// ...