0

0

C++ 怎么读取CSV数据 C++ 解析逗号分隔文本方法【文件流】

冰火之心

冰火之心

发布时间:2026-01-29 13:53:02

|

771人浏览过

|

来源于php中文网

原创

最稳妥方式是先用std::getline按行读取再手动切分;需处理引号包围、空字段、UTF-8路径等细节,避免operator>>或逗号分隔误判。

c++ 怎么读取csv数据 c++ 解析逗号分隔文本方法【文件流】

std::ifstream 逐行读取 CSV 最稳妥

CSV 不是标准格式,没有统一规范(比如字段含换行、逗号或引号时需转义),所以别指望一行代码全解析。最可控的方式是先用 std::getline 按行读入字符串,再对每行做字段切分——这样能避免二进制读取错位、编码识别失败等问题。

常见错误:直接用 operator>> 读取,遇到空格或逗号就中断;或用 std::getline(in, line, ',') 试图按逗号分割,但 CSV 的逗号可能在引号内,这会导致字段错位。

实操建议:

  • std::ifstream 打开文件,检查 is_open()failbit
  • 每行用 std::getline(in, line) 读取完整行(保留原始换行和空格)
  • 跳过空行和 BOM(Windows 记事本生成的 UTF-8 文件开头可能有 \xEF\xBB\xBF
  • 后续再对 line 做安全切分(见下节)

手动切分 CSV 字段要处理引号包围场景

标准 CSV 允许字段用双引号包裹,里面可含逗号、换行甚至双引号(用两个连续双引号表示)。如果只用 std::string::find(',') 粗暴分割,遇到 "Smith, John","25","Engineer" 就会切成 5 段而不是 3 段。

立即学习C++免费学习笔记(深入)”;

实操建议:

  • 写一个简单状态机:记录是否在引号内(in_quotes = false),遇到 " 就翻转状态
  • 只在 !in_quotes && c == ',' 时切分字段
  • 遇到 "" 就替换成单个 "(需在提取字段后做)
  • 字段首尾的引号要去掉,但仅当字段以 " 开头且以 " 结尾时才处理

示例片段(不带引号处理):

Tago AI
Tago AI

AI生成带货视频,专为电商卖货而生

下载
std::vector fields;
size_t start = 0, end = line.find(',');
while (end != std::string::npos) {
    fields.push_back(line.substr(start, end - start));
    start = end + 1;
    end = line.find(',', start);
}
fields.push_back(line.substr(start)); // 最后一段

std::stringstream 解析数值字段容易出错

读到字符串字段后,常需转成 intdouble 等类型。别直接用 std::stoistd::stod——它们遇到空字符串、纯空格或非法字符会抛 std::invalid_argument,而 CSV 中常见缺失值如 123,,45.6 会产生空字段。

实操建议:

  • 先用 field.empty()field.find_first_not_of(" \t") == std::string::npos 判空
  • 转数字前用 std::stringstream ss(field); int x; if (ss >> x && ss.eof()) { ... },确保整字段都被消费
  • 避免 atoi(field.c_str()),它对空指针或非法输入返回 0,无法区分 “0” 和错误

中文路径或 UTF-8 文件名在 Windows 下打不开

Windows 默认用本地编码(如 GBK)解释文件名,而现代编辑器保存的 CSV 多为 UTF-8 编码。用 std::ifstream("数据.csv") 在中文路径下大概率失败(failbit 置位)。

实操建议:

  • Linux/macOS 不用额外处理;Windows 下优先改用宽字符接口:std::wifstream + std::filesystem::u8path(C++17)
  • 或用第三方库如 boost::nowide::ifstream
  • 若坚持用窄字符,可先将 UTF-8 路径转为 UTF-16 再调用 _wfopen,但跨平台性差

真正麻烦的不是读取本身,而是 CSV 规范的模糊性:引号嵌套、BOM、混合编码、超长行……这些细节一旦忽略,程序在某个用户文件上静默出错,比崩溃更难排查。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号