嵌套while循环结合getline使用时内层循环仅执行一次的问题
解决getline读取文件构建邻接图时内层循环仅运行一次的问题
我帮你分析下这个问题哈!你现在用嵌套getline读取文件构建邻接图,内层循环最多只运行一次的原因其实很典型——是stringstream的状态残留导致的。
问题根源
第一次外层getline读取一行内容写入ss后,内层getline会把ss里的所有逗号分隔条目读完,这时候ss的EOF(文件结束)标志会被置位。当进入下一次外层循环,你再往ss里写入新的行时,ss还处于错误状态(因为EOF标志没清除),后续的内层getline会直接跳过,看起来就像只运行了一次。
两种解决办法
办法一:每次处理新行时新建stringstream
把stringstream的定义移到外层while循环内部,这样每处理一行就创建一个全新的流,完全避免状态残留的问题:
string title = argv[1]; ifstream myfile(title); string line; string word; if (myfile.is_open()) { while (getline(myfile, line)) { stringstream ss(line); // 每次循环创建新的流,传入当前行内容 while (getline(ss, word, ',')) { // 这里写你的邻接图构建逻辑,比如解析word并添加到对应节点的邻接列表 } } myfile.close(); // 记得用完文件后关闭 } else { cout << "无法打开目标文件,请检查路径是否正确!" << endl; }
办法二:重置已有stringstream的状态和内容
如果不想每次新建流,可以在每次写入新行前,先清空流的内容并重置它的状态标志:
string title = argv[1]; ifstream myfile(title); string line; string word; stringstream ss; if (myfile.is_open()) { while (getline(myfile, line)) { ss.str(""); // 清空流中已有的内容 ss.clear(); // 重置流的状态(清除EOF、fail等错误标志) ss << line; while (getline(ss, word, ',')) { // 你的邻接图处理逻辑 } } myfile.close(); } else { cout << "无法打开目标文件,请检查路径是否正确!" << endl; }
补充说明
两种办法都能解决问题,第一种代码更简洁直观,第二种适合需要复用stringstream的场景。另外,记得处理文件打开失败的情况,避免程序崩溃哦。
内容的提问来源于stack exchange,提问作者FIRE_EEL
相关产品推荐
相关产品推荐

