c++如何按行读取文件_c++ getline函数详解【笔记】
技术百科
尼克
发布时间:2026-01-25
浏览: 次 std::getline是C++按行读取文本文件最可靠、最常用的方式,但需注意流状态、换行符兼容性和UTF-8 BOM等细节问题。
直接说结论:用 std::getline 是 C++ 按行读取文本文件最可靠、最常用的方式,但必须注意流状态、换行符兼容性和编码边界问题。
为什么不能用 operator>> 代替 getline
operator>> 遇到空格、制表符或换行就停止,根本读不到完整一行;而 std::getline 默认以 '\n' 为分隔符,能读取含空格的整行(不含换行符本身)。常见错误是混用两者后导致第一行“消失”——因为 operator>> 留下的换行符被下一次 getline 立即读作空行。
- 先调
cin >> x再调getline(cin, s)→s极大概率为空,需加cin.ignore() - 文件开头有 BOM(如 UTF-8 with BOM),
getline会把0xEF 0xBB 0xBF当作普通字符读入首行 -
getline不跳过前导空白,但operator>>会——这点常被误认为“getline有问题”
getline 的三个重载版本怎么选
实际开发中几乎只用两个:std::getline(std::istream&, std::string&) 和带分隔符的三参数版本。第三个(C 风格字符数组版)已基本淘汰,不安全且难控制缓冲区大小。
- 默认版:
std::getline(file, line)—— 适合绝大多数纯文本,自动处理\n、\r\n(Windows)和\r(旧 Mac) - 自定义分隔符:
std::getline(file, line, '\t')—— 用于 TSV 解析,但注意它不会跳过连续分隔符,"a\t\tb"会读出空字符串 - 别用
std::getline(std::istream&, char*, int):缓冲区溢出风险高,C++11 后无正当理由不用
读取循环里最容易忽略的流状态检查
while (getline(file, line)) 看似简洁,但掩盖了 EOF 和读取失败的区别。真正健壮的写法要区分:是文件结束?还是磁盘错误?还是编码损坏导致无法解析?
-
getline成功时返回file(转为true),失败时设failbit或badbit - 循环结束后应检查
if (file.eof())判断是否正常结束,否则可能是file.fail()导致的异常中断 - UTF-8 文件含非法字节序列时,某些标准库实现(如 libstdc++)可能静默截断,而非报错——需额外验证
line是否包含孤立的0xC0–0xFF
跨平台换行与性能小陷阱
Windows 下文本模式文件流会自动将 \r\n 转为 \n,Linux/macOS 下则原样保留。这通常没问题,但若你手动拼接字符串或做行号统计,要注意 \r 可能残留在行尾(尤其从网络或剪贴板读入时)。
- 用
line.erase(std::remove(line.begin(), line.end(), '\r'), line.end())清理杂散\r(仅当确定不需要保留时) - 频繁读小文件时,
std::string的反复分配会影响性能;可复用同一string对象,或预分配容量:line.reserve(1024) - 二进制模式打开文件(
ios::binary)后,getline仍可用,但不再自动转换换行符——此时\r\n会被当作两个字符,line末
尾会多出
\r
真正麻烦的从来不是函数怎么调,而是你不知道它在什么情况下不按预期工作——比如 BOM、混合换行、流状态残留、编码异常,这些细节往往要等到线上日志乱码或某台机器上循环少读一行时才暴露出来。
# ai
# windows
# 不需要
# 跳过
# 要注意
# 最常用
# 文本文件
# mac
# win
# linux
# 循环
# 对象
# macos
# cos
# c++
# String
# if
# int
# 编码
# 字节
# 区别
# stream
# 字符串
# 行号
# operator
# while
# bom
# char
# ios
# 分隔符
# EOF
# 换行
# cin
# 最可靠
# 换行符
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- C++如何使用std::optional?(处理可
- Mac电脑进水了怎么办_MacBook进水后紧急处
- php怎么下载安装后无法解析php文件_服务器配置
- 如何使用Golang实现跨域请求支持_Golang
- Windows10系统怎么查看显卡型号_Win10
- Win11如何添加/删除输入法 Win11切换中英
- PyTorch DDP 多进程训练在 Kaggle
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Windows服务启动类型恢复方法_错误修改导致的
- Win11截图快捷键是什么_Win11自带截图工具
- Django 测试数据库表缺失与字段未创建问题的完
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Win11怎么设置默认邮件客户端 Win11修改M
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- Linux怎么修改用户密码_Linux系统pass
- Python与GPU加速技术_CUDA与Numba
- php8.4匿名类怎么用_php8.4匿名类创建与
- php本地部署支持nodejs吗_php与node
- Python对象生命周期管理_创建销毁解析【教程】
- 如何用::实现工具类方法调用_php静态工具类设计
- Win11怎么用设置清理回收站_Win11设置清理
- LINUX怎么查看进程_LINUX ps命令查看运
- Win11怎么更改计算机名_Windows11系统
- php能跑在stm32上吗_php在stm32微控
- 如何在Golang中定义接口_抽象方法和多态实现
- Win10如何卸载WindowsDefender_
- Windows系统被恶意软件破坏后的恢复策略_错误
- Win11怎么修复系统文件_使用sfc命令修复Wi
- php本地部署后session无法保存_sessi
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- 如何使用Golang反射将map转换为struct
- 如何在Golang中捕获HTTP服务器错误_Gol
- php接口返回数据乱码怎么办_php接口调试编码问
- Mac怎么进行语音输入_Mac听写功能设置与使用【
- Windows10电脑怎么设置虚拟内存_Win10
- Windows10怎么备份注册表_Windows1
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Go 中实现 Python urllib.quot
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- Win10怎么卸载迅雷_Win10彻底卸载迅雷方法
- Win11搜索栏无法输入_解决Win11开始菜单搜
- Windows10如何删除Windows.old_
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- Win10系统更新错误0x80240034怎么办
- 如何在 Python 测试中动态配置 @backo
- 如何将竖排文本文件转换为横排字符串
- 如何使用Golang管理跨项目依赖_Golang多
- c++ std::atomic如何保证原子性 c+
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Python文件操作优化_大文件与流处理解析【教程


QQ客服