如何用C++读取Excel CSV文件的double列并存入vector<double>变量?
问题分析与解决
错误原因
你的代码有两个核心问题导致无输出:
- 表头转换异常:CSV第一行是表头
A,B,stod(val)尝试把字符串"A"转换成double时,会触发std::invalid_argument异常,默认情况下程序会直接终止,后续代码完全没机会执行,自然没有控制台输出。而你之前用string测试时只是存储字符串,不会触发转换异常,所以能正常运行。 - 读取逻辑不匹配CSV结构:Excel导出的CSV中,每行末尾的换行符会被以逗号为分隔符的
getline忽略,导致后续读取可能混入换行符,同时你没有处理文件打开失败的情况(比如文件路径错误)。
修正方案
方案1:跳过表头+异常捕获+正确读取
先跳过表头行,再逐行读取A列数据,同时捕获转换异常,避免程序崩溃:
#include <iostream> #include <fstream> #include <vector> #include <stdexcept> using namespace std; int main() { ifstream myFile("CData.csv"); // 检查文件是否成功打开 if (!myFile.is_open()) { cout << "无法打开文件" << endl; return 1; } string line; vector<double> y; // 跳过表头行 getline(myFile, line); // 逐行读取数据 while (getline(myFile, line)) { // 分割每行的第一个元素(逗号前的内容) size_t commaPos = line.find(','); if (commaPos == string::npos) continue; // 跳过无效行 string val = line.substr(0, commaPos); try { double num = stod(val); y.push_back(num); cout << "test: " << num << endl; } catch (const invalid_argument& e) { cout << "转换失败:" << val << endl; } catch (const out_of_range& e) { cout << "数值超出范围:" << val << endl; } } myFile.close(); return 0; }
方案2:简化读取逻辑(针对固定列)
如果确认A列始终是每行的第一个字段,也可以直接用逗号分隔读取,但需要先跳过表头:
#include <iostream> #include <fstream> #include <vector> #include <stdexcept> using namespace std; int main() { ifstream myFile("CData.csv"); if (!myFile.is_open()) { cout << "无法打开文件" << endl; return 1; } string val; vector<double> y; // 跳过表头的两个字段(A和B) getline(myFile, val, ','); getline(myFile, val); // 读取A列数据 while (getline(myFile, val, ',')) { try { double num = stod(val); y.push_back(num); cout << "test: " << num << endl; } catch (const exception& e) { cout << "处理失败:" << val << endl; } // 跳过当前行的B列内容 getline(myFile, val); } myFile.close(); return 0; }
其他注意事项
- 确保文件路径正确:如果程序和CSV不在同一目录,要使用绝对路径(比如
"C:/xxx/CData.csv")。 - Excel导出CSV时,注意编码格式(一般用UTF-8),避免读取到乱码导致转换失败。
内容的提问来源于stack exchange,提问作者chicken420
相关产品推荐
相关产品推荐

