应优先使用 std::ifstream/std::ofstream 而非 fopen;读文本用 std::getline 避免 operator>> 截断;检查 is_open() 或直接 if(!file);逐行读取需 while(std::getline(file,line));中文路径在 windows 需 wifstream + wstring + imbue;写文件须检查 fail()/bad() 并显式 close()。

直接用 std::ifstream 和 std::ofstream,别碰 fopen 那套 C 风格——除非你明确需要二进制兼容或跨平台底层控制。
读文本文件:用 std::getline 而不是 operator>>
operator>> 遇到空格、制表符、换行就停,根本读不全一行;std::getline 才是读整行的正确姿势。
- 检查文件是否打开成功:
if (!file.is_open())或直接if (!file) - 逐行读取时,
std::getline(file, line)返回bool,要放在 while 条件里,别写成while (file.good())—— 后者会在最后一次读失败后多循环一次 - 如果文件含中文路径或 UTF-8 内容,Windows 下需先调用
std::locale::global(std::locale(""))(注意:仅对宽字符流稳定,窄字符流仍可能乱码)
写文件时:记得检查 fail() 和 bad()
写失败不报异常(默认不开启异常),只设标志位。只查 good() 不够,fail() 表示格式/逻辑错误(如往只读流写),bad() 表示底层 I/O 故障(如磁盘满、路径无权限)。
- 写完务必调用
file.close(),否则缓冲区可能未刷出,尤其在小文件或调试时容易误以为写入成功 - 用
std::ofstream file("out.txt", std::ios::app)追加写,别漏std::ios::app—— 默认是覆盖模式 - 若写入结构体或二进制数据,改用
write(reinterpret_cast<const char>(&obj), sizeof(obj))</const>,但注意字节序和内存对齐,不可跨平台直接读
处理路径和编码:C++ 标准库本身不解析路径
std::ifstream 接收 const char* 或 std::string,传入含中文的路径在 Windows 上大概率失败,因为默认用本地 ANSI 编码转义,而现代系统路径是 UTF-16。
- Windows 下稳妥做法:用
std::wifstream+std::wstring,并调用file.imbue(std::locale("")) - 跨平台项目建议用第三方库(如
std::filesystemC++17 起可用,但路径构造与打开仍是两步,std::filesystem::path不自动解决编码问题) - Linux/macOS 下一般没问题,但依然避免硬编码路径,优先用相对路径或命令行参数传入
最常被忽略的是:流对象析构时会隐式调用 close(),但若中途发生异常或提前 return,缓冲区内容可能丢失;显式 close() 并检查状态,才是生产代码该有的习惯。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











