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

如何在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;
}

优化说明

  1. 拆分逻辑改为逐行读取后按逗号拆分,彻底解决原逻辑的跨行拼接问题,适配所有符合username,password格式的行
  2. 取消硬编码的长度限制,支持任意行数的CSV文件读取
  3. 添加文件打开校验和错误行容错逻辑,避免异常场景下程序直接崩溃
  4. 提前为容器预留空间,减少动态扩容的性能开销,2万行数据读取效率提升明显
  5. 移除冗余的中间存储容器,内存占用降低一半

内容的提问来源于stack exchange,提问作者Kal-EL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:54:00