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

C++读取CSV文件存入二维数组返回null问题咨询

问题核心原因

你的代码存在多处逻辑错误,没有正确从文件读取内容到数组,和stringstream写入数组的专门函数无关,错误点如下:

  • 未读取文件行内容:你定义了std::string line;变量,但从未调用std::getline(in, line)从文件输入流中读取每一行的内容,初始化std::stringstream时传入的是空字符串,自然拆分不到任何有效数据。
  • 存在多余的错误赋值语句:lineStream = data[i][j];这行是完全无效的错误代码,你已经通过std::getline(lineStream, data[i][j], ',')把分隔后的值写入了数组元素,这行赋值会直接破坏stringstream的状态,导致后续读取失效。
  • 函数返回值逻辑缺失:文件打开成功的分支没有写return true;语句,且代码末尾多了冗余的闭合大括号,存在语法问题。
  • 传入的文件路径被硬编码覆盖:函数参数接收了文件路径fh,但函数第一行直接把fh赋值为固定路径,传入的参数完全失效,如果你的CSV文件不在该硬编码路径下,也会读取失败。

修正后的代码示例

bool readUsers(string fh, string data[ROWS][COLS]) {
  // 如果需要固定路径可以保留fh的硬编码赋值,否则直接用传入的fh即可
  std::ifstream in(fh);
  if (!in.is_open()) {
    return false;
  }
  std::string line;
  for(int i = 0; i < ROWS; i++ ){
    // 先从文件流读取一行内容
    if (!std::getline(in, line)) {
      break; // 文件行数不足ROWS时提前退出,避免写入空内容
    }
    std::stringstream lineStream(line);
    for(int j = 0; j < COLS; j++){
      std::getline(lineStream, data[i][j], ',');
      // 可选逻辑:清理内容前后的空格和引号,不需要可以删除
      size_t start = data[i][j].find_first_not_of(" \t\"");
      size_t end = data[i][j].find_last_not_of(" \t\"");
      if (start != string::npos && end != string::npos) {
        data[i][j] = data[i][j].substr(start, end - start + 1);
      }
    } 
  }
  in.close();
  return true;
}

额外注意事项

你给出的CSV示例内容带引号和元素前的空格,上面代码里增加了可选的清理逻辑,可以把多余的符号去掉,不需要直接删除对应代码段即可。


内容的提问来源于stack exchange,提问作者sethro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:48:03