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
相关产品推荐
相关产品推荐

