C++如何按逗号分隔字符串并正确存入二维vector
问题根因
你当前代码统计元素数量不符合预期的核心原因是内层读取字段的逻辑用了流提取运算符>>:
>>运算符默认以**任意空白字符(空格、换行、制表符)**作为分隔边界,完全不会识别逗号作为分隔符- 因此带空格的课程名(比如
Operating Systems、Introduction to Algorithms)会被拆成多个独立字符串,最终导致每行的元素计数错误,比如你提到的第三行CSCI350,Operating Systems,CSCI300会被拆成2个元素,和预期的3个不符。
你之前担心直接用getline加逗号分隔符会把所有内容拆成独立行,是因为你是直接在文件输入流上调用带逗号分隔符的getline,只要把逗号分隔的拆分逻辑限定在逐行读取得到的单行字符串流里,就不会出现这个问题。
修复方案
只需要修改内层循环的字段读取逻辑,把原来用>>读取的部分,换成在单行字符串流上用逗号作为分隔符调用getline即可,修复后的完整LoadFile函数如下:
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); } } // 验证输出 for (int i = 0; i < courseInfo.size(); i++) { for (int j = 0; j < courseInfo[i].size(); j++) { cout << courseInfo[i][j] << ' '; } cout << '\n'; } }
运行效果
用你提供的测试文件运行后,courseInfo[2].size()会正确返回3,三个元素分别是CSCI350、Operating Systems、CSCI300,所有带空格的课程名都会被保留为完整的单个字段,不会被空格拆分。
注:如果后续你的CSV文件出现字段包裹在引号中、字段内部本身包含逗号的场景,需要额外增加引号解析逻辑,当前实现可以完全适配你给出的示例数据格式。
内容的提问来源于stack exchange,提问作者Bmore
相关产品推荐
相关产品推荐

