[英]Reading file line by line and tokenizing lines
我有一个多行文件。 行包含用逗号分隔的整数
在下面的代码中,它仅解析第一行,而不解析重命名行。 任何关于我做错事的见解?
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;
}
}
}
}
任何关于我做错事的见解?
必须先重置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;
}
}
}
这里的问题是stringstream
对于while循环而言不是局部的。 第一次从stringstream
流读取时,将耗尽该流,这将导致EOF标志被设置。 如果您不清除该内容,那么即使您加载更多内容,也永远不会从中读取更多信息。 解决此问题的最简单方法是使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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.