我有一个包含多行的文件。 行包含用逗号分隔的整数
在以下代码中,它仅解析第一行,但不解析重命名行。关于我做错的任何见解?
void parseLines(std::ifstream &myfile){
std::string line, token;
std::stringstream ss;
int i;
vector<int> r;
while(myfile) {
getline(myfile, line);
ss.str("");
ss.str(line);
if(myfile){
cout << "SS" << ss.str() << endl;
while (std::getline(ss, token, ',')){
std::cout << token << std::endl;
}
}
}
}
答案 0 :(得分:2)
关于我做错的任何见解?
在读取第二行的数据之前,需要重置ss
的状态。
更好的是,在循环中移动ss
的构造。
在此期间,
while(myfile)
替换为while(getline(myfile, line))
。token
的声明。void parseLines(std::ifstream &myfile){
std::string line;
int i;
vector<int> r;
while( getline(myfile, line) )
{
std::stringstream ss(line);
std::string token;
while (std::getline(ss, token, ',')){
std::cout << token << std::endl;
}
}
}
答案 1 :(得分:2)
这里的问题是stringstream
不是while循环的本地。当您第一次排出导致EOF标志设置的流时,从stringstream
读取。如果您不清楚,那么即使您加载更多信息,您也永远不会从中读取任何更多信息。解决这个问题的最简单方法是使循环体的stringstream
本地化,这样你就可以在每次迭代时从一个新的开始,你不必担心清理标志。这会使你的代码看起来像
while(getline(myfile, line)) // also moved the line reading here to control when to stop the loop
{
std::stringstream ss(line);
while (std::getline(ss, token, ',')){
std::cout << token << std::endl;
}
}