C++读取文件数据到vector时重复添加首行的问题
问题原因及解决方案
你的问题出在std::istringstream的状态管理上。第一次读取完第一行数据后,strData会进入EOF(文件结束)状态,后续即使通过str(strInput)更新了它的内部字符串,这个EOF标志位不会自动重置,导致后续的while(strData >> idy)循环直接跳过,不会读取新行的内容,所以vector里只重复添加了第一行的数据。
以下是两种可行的解决方案:
方案1:每次循环创建新的istringstream对象
把std::istringstream的声明移到for循环内部,每次迭代都生成一个全新的流对象,避免残留的状态影响后续读取:
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <vector> int main() { std::ifstream input; std::string strInput; std::vector<int> vectData; input.open("input.txt"); for (int idx = 0; idx < 3; idx++) { std::getline(input >> std::ws, strInput, '\n'); std::istringstream strData(strInput); // 每次循环新建流对象 int idy; while(strData >> idy) { vectData.push_back(idy); } std::cout << strData.str() << std::endl; for (auto i:vectData) { std::cout<< i << ' '; } std::cout << '\n' << std::endl; } return 0; }
方案2:复用流对象,每次重置状态
如果要复用同一个istringstream,需要在更新内部字符串前调用clear(),清除之前的EOF等状态标志:
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <vector> int main() { std::ifstream input; std::string strInput; std::istringstream strData; std::vector<int> vectData; input.open("input.txt"); for (int idx = 0; idx < 3; idx++) { std::getline(input >> std::ws, strInput, '\n'); strData.clear(); // 清除流的状态标志 strData.str(strInput); // 更新内部字符串 int idy; while(strData >> idy) { vectData.push_back(idy); } std::cout << strData.str() << std::endl; for (auto i:vectData) { std::cout<< i << ' '; } std::cout << '\n' << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者Roger Francis
相关产品推荐
相关产品推荐

