在C++中处理CSV文件,本质上是按行读取文本,再把每行按逗号切分成字段。下面介绍一种不依赖第三方库的实现方法,既能读也能写。

CSV读写的基本思路
CSV全称是逗号分隔值,每一行代表一条记录,字段之间用逗号隔开。最简单的情况可以直接用std::getline读行,再用std::stringstream按逗号拆分。
读取CSV文件示例
下面的代码演示如何从文件读取CSV并打印每个字段:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::ifstream file("data.csv");
std::string line;
// 逐行读取
while (std::getline(file, line)) {
std::stringstream ss(line);
std::string field;
std::vector<std::string> row;
// 按逗号拆分
while (std::getline(ss, field, ',')) {
row.push_back(field);
}
// 输出该行字段
for (const auto& f : row) {
std::cout << f << " | ";
}
std::cout << std::endl;
}
return 0;
}
写入CSV文件示例
写入时把字段用逗号连接,再写入每行即可:
#include <fstream>
#include <string>
#include <vector>
int main() {
std::ofstream file("out.csv");
std::vector<std::string> row1 = {"name", "age", "city"};
std::vector<std::string> row2 = {"Tom", "20", "Beijing"};
// 写表头
for (size_t i = 0; i < row1.size(); ++i) {
file << row1[i];
if (i != row1.size() - 1) file << ",";
}
file << "n";
// 写数据
for (size_t i = 0; i < row2.size(); ++i) {
file << row2[i];
if (i != row2.size() - 1) file << ",";
}
file << "n";
return 0;
}
处理带逗号的字段
如果字段本身包含逗号,标准CSV会用双引号包裹该字段。简单的切分逻辑需要改为状态机方式,遇到引号时不按逗号拆分。
带引号字段的读取函数
#include <string>
#include <vector>
std::vector<std::string> parse_line(const std::string& line) {
std::vector<std::string> res;
std::string cur;
bool in_quotes = false;
for (char c : line) {
if (c == '"') {
in_quotes = !in_quotes; // 切换引号状态
} else if (c == ',' && !in_quotes) {
res.push_back(cur); // 结束当前字段
cur.clear();
} else {
cur += c;
}
}
res.push_back(cur);
return res;
}
小结
使用C++处理CSV文件并不复杂,标准库中的文件流和字符串流已经足够应对多数基础场景。若数据量较大或格式复杂,再考虑使用专用解析库。