You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:27:09