C++调用函数加载数据到2D vector后主函数内向量为空问题
问题原因
你的LoadFile函数参数用的是值传递,调用函数时会为courseInfo创建一个独立的临时副本,函数内部所有插入数据的操作都只修改这个临时副本,函数执行结束后临时副本会被直接销毁,main函数里定义的原始vector自始至终没有被写入任何数据,自然打印的时候是空的。
你提到试过让函数返回vector还是没解决,大概率是调用时没有用main里的变量接收函数返回值,或者返回逻辑写得不对。
修复方案
两种实现都可以,优先选第一种引用传递的写法,更符合你最初的设计逻辑。
方案1:改为引用传递(推荐)
给函数的vector参数加上引用符&,这样函数操作的就是main中原始vector本身,不会产生拷贝:
// 注意参数中的&,代表引用传递 void LoadFile(vector<vector<string>>& courseInfo) { ifstream courses; courses.open("CourseInfo.txt"); if (!courses.is_open()) { cout << "Error opening file"; return; // 文件打开失败直接退出,不要继续执行后续逻辑 } string line; while (getline(courses, line)) { courseInfo.push_back(vector<string>()); stringstream split(line); string value; while (getline(split, value, ',')) { courseInfo.back().push_back(value); } } courses.close(); // 用完文件流主动关闭 }
改完参数后,main函数里原有的LoadFile(courseInfo);调用不需要做任何修改,就能正常把数据写入main里的vector。
方案2:正确实现返回vector的逻辑
如果要走返回值的路线,需要把函数返回值类型改成二维vector,且调用时必须接收返回值:
// 函数返回值类型改为vector<vector<string>>,不需要传参 vector<vector<string>> LoadFile() { vector<vector<string>> courseInfo; // 函数内部定义局部变量存储读取到的数据 ifstream courses; courses.open("CourseInfo.txt"); if (!courses.is_open()) { cout << "Error opening file"; return courseInfo; } string line; while (getline(courses, line)) { courseInfo.push_back(vector<string>()); stringstream split(line); string value; while (getline(split, value, ',')) { courseInfo.back().push_back(value); } } courses.close(); return courseInfo; // 把存好数据的vector返回 }
对应main函数中case 1的调用代码要修改为接收返回值:
case 1: // 接收函数返回的加载好数据的vector,赋值给main中的变量 courseInfo = LoadFile(); break;
其他需要修正的小问题
- 你原代码打印换行的地方写的
std::cout << ' ';是语法错误,要改成std::cout << '\n';或者std::cout << std::endl; - 用
cin >> choice读取菜单选项后,输入缓冲区会残留换行符,后续如果要使用getline读取用户输入的整行内容,需要先清空缓冲区残留的换行,否则会读到空行。
内容的提问来源于stack exchange,提问作者Bmore
相关产品推荐
相关产品推荐

