如何在C++中正确读取CSV文件数据并将字段存入对应vector容器
C++ 读取CSV拆分用户名密码的优化方案
原代码存在的核心问题
- 分隔逻辑错误:仅用逗号作为
getline的分隔符,会将上一行的密码与下一行的用户名拼接成同一个字符串,无法正确按行拆分字段 - 硬编码遍历范围:固定
i<8仅适配4行测试数据,无法适配2万行的实际场景 - 缺少文件打开校验:如果文件不存在或路径错误,代码不会给出任何提示直接异常运行
- 读取终止条件错误:
while(myfile.good())会在到达文件末尾后多执行一次读取,导致容器末尾多出空字符串 - 冗余存储:额外使用
data容器存储所有字段,多占用一倍内存,属于无必要开销
优化后代码
#include <bits/stdc++.h> using namespace std; int main() { // 只读场景使用ifstream更适配,文件名替换为你实际的存储路径 ifstream myfile("userinfo.csv"); // 校验文件是否成功打开 if (!myfile.is_open()) { cerr << "文件打开失败,请检查文件路径是否正确" << endl; return 1; } vector<string> usernames, passwords; // 提前预留2万条空间,避免多次动态扩容的性能损耗 usernames.reserve(20000); passwords.reserve(20000); string line; // 逐行读取,到文件尾自动终止 while (getline(myfile, line)) { size_t comma_pos = line.find(','); // 容错处理:格式错误的行直接跳过并提示 if (comma_pos == string::npos) { cerr << "跳过格式错误的行:" << line << endl; continue; } // 拆分用户名和密码直接存入目标容器 usernames.push_back(line.substr(0, comma_pos)); passwords.push_back(line.substr(comma_pos + 1)); } myfile.close(); // 此处可添加后续业务逻辑 cout << "成功读取" << usernames.size() << "条用户数据" << endl; return 0; }
优化说明
- 拆分逻辑改为逐行读取后按逗号拆分,彻底解决原逻辑的跨行拼接问题,适配所有符合
username,password格式的行 - 取消硬编码的长度限制,支持任意行数的CSV文件读取
- 添加文件打开校验和错误行容错逻辑,避免异常场景下程序直接崩溃
- 提前为容器预留空间,减少动态扩容的性能开销,2万行数据读取效率提升明显
- 移除冗余的中间存储容器,内存占用降低一半
内容的提问来源于stack exchange,提问作者Kal-EL
相关产品推荐
相关产品推荐

