c++文件读写操作_c++ ifstream与ofstream用法
发布时间 - 2026-01-11 00:00:00 点击率:次ifstream默认不抛异常,需检查is_open()或failbit;写入中文乱码主因是locale与文件编码不匹配,推荐wofstream配codecvt_utf8;二进制读写应避免eof(),改用read()和gcount()。
ifstream 打开文件失败却不报错?检查 failbit 和 is_open()
默认情况下,ifstream 构造或 open() 失败不会抛异常,对象进入失效状态但不崩溃。常见现象是后续 getline() 或 >> 读不出内容,变量值还是初始值。
- 务必在打开后检查:
if (!fin.is_open())或if (fin.fail()) - 更稳妥的做法是启用异常位:
fin.exceptions(ifstream::failbit | ifstream::badbit);,这样失败会直接抛std::ios_base::failure - 路径含中文或空格时,Windows 下建议用 UTF-8 编码源文件 +
std::locale::global(std::locale(""));(仅限本地环境),否则可能因编码不匹配打不开
ofstream 写入中文乱码?别只盯着 setf(ios::unitbuf)
乱码主因不是缓冲区,而是流的 locale 和文件实际编码不一致。VS 默认窄字符流用系统 ANSI(如 GBK),而源文件常为 UTF-8,写入字节流后用 UTF-8 编辑器打开就显示乱码。
- 若需写 UTF-8 文本,**不要**用
ofstream直接写std::string中文——它只是按字节转发,不转码 - 简单方案:用
std::wofstream+std::locale绑定 UTF-8 facet(需 C++11 以上):std::wofstream wout("out.txt"); wout.imbue(std::locale(wout.getloc(), new std::codecvt_utf8)); wout << L"你好"; - 跨平台稳妥做法:手动将 UTF-8 字符串(
std::string)以二进制方式写入,确保编辑器用 UTF-8 解码——此时不用改 locale,但必须用ofstream("xxx", ios::binary)
读写同一文件用 fstream 时,seekg() 和 seekp() 要分开调
fstream 同时维护输入位置(get pointer)和输出位置(put pointer),二者独立。混用 read() 和 write() 时,不显式重定位会导致读写错位。
- 写完立即读,必须先
seekg(0)回开头;读完想追加写,得seekp(0, ios::end) - 使用
ios::in | ios::out模式打开时,文件必须已存在(ios::trunc会清空,ios::app会强制写末尾,不支持随机读写
) - 若需读写+创建文件,推荐分两步:先用
ofstream创建并写,再用ifstream读;或用fstream加ios::in | ios::out | ios::ate,然后手动seekg(0)
大文件循环读取卡死?别用 while (!fin.eof())
eof() 只在**尝试读取失败后**才返回 true,循环体末尾检测会导致多执行一次无效读取,甚至使 fin 进入 failbit 状态,后续操作全部失效。
- 正确写法是把读取动作作为 while 条件:
while (getline(fin, line)) { ... }或while (fin >> value) { ... } - 对二进制大文件,优先用
read()配合gcount()判断实际读取字节数,避免依赖eof() - 频繁小块读写影响性能,可手动设置缓冲区:
fin.rdbuf()->pubsetbuf(buffer, bufsize);(注意:必须在 open 前调用)
is_open() 返回 false 却不告诉你为什么,这时候看一眼 errno 或用 strerror(errno) 才能知道到底是 “No such file” 还是 “Permission denied”。
# windows
# 编码
# 字节
# 中文乱码
# ai
# c++
# ios
# win
# stream
# 为什么
# EOF
# String
# if
# while
# 字符串
# errno
# strerror
# 循环
# ofstream
# ifstream
# fstream
# pointer
# 对象
# 或用
# 不匹配
# 大文件
# 若需
# 不出
# 告诉你
# 盯着
# 不支持
# 只在
# 再用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Ubuntu系统下快速搭建WordPress个人网站?
JS经典正则表达式笔试题汇总
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何创建自定义Artisan命令?(代码示例)
如何在阿里云虚拟主机上快速搭建个人网站?
如何快速搭建安全的FTP站点?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
,怎么在广州志愿者网站注册?
Laravel storage目录权限问题_Laravel文件写入权限设置
如何在七牛云存储上搭建网站并设置自定义域名?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
简历在线制作网站免费版,如何创建个人简历?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
EditPlus中的正则表达式 实战(1)
浅谈Javascript中的Label语句
Laravel如何实现文件上传和存储?(本地与S3配置)
详解MySQL数据库的安装与密码配置
微信小程序 input输入框控件详解及实例(多种示例)
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
java获取注册ip实例
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何实现javascript表单验证_正则表达式有哪些实用技巧
Python数据仓库与ETL构建实战_Airflow调度流程详解
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel distinct去重查询_Laravel Eloquent去重方法
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
在Oracle关闭情况下如何修改spfile的参数
Laravel Fortify是什么,和Jetstream有什么关系
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
百度浏览器如何管理插件 百度浏览器插件管理方法
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何确保西部建站助手FTP传输的安全性?
如何挑选高效建站主机与优质域名?
如何在IIS7上新建站点并设置安全权限?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel怎么使用artisan命令缓存配置和视图
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
创业网站制作流程,创业网站可靠吗?


)