1. 为什么需要掌握C/C++文件操作?
在Windows平台开发中,文件操作是最基础也是最重要的技能之一。无论是配置文件读写、日志记录、数据持久化,还是实现自定义文件格式,都离不开对文件系统的操作。C/C++作为系统级语言,提供了最直接的文件操作接口,这也是为什么30年过去了,这些API依然活跃在各类项目中。
我见过太多开发者因为文件操作不当导致的bug:数据丢失、权限问题、编码混乱...这些问题往往源于对基础API的理解不足。本文将带你深入理解Windows平台下C/C++文件操作的四种典型方式,从最传统的C语言方式到现代C++17的文件系统库。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C语言传统文件操作
2.1 文件打开与关闭
c复制FILE* fopen(const char* filename, const char* mode);
这个看似简单的函数其实暗藏玄机。mode参数的不同组合直接影响文件的行为:
| 模式 | 说明 | 文件存在 | 文件不存在 |
|---|---|---|---|
| "r" | 只读 | 打开成功 | 打开失败 |
| "w" | 只写 | 清空内容 | 创建新文件 |
| "a" | 追加 | 保留内容 | 创建新文件 |
| "r+" | 读写 | 打开成功 | 打开失败 |
| "w+" | 读写 | 清空内容 | 创建新文件 |
| "a+" | 读写 | 保留内容 | 创建新文件 |
注意:在Windows平台下,建议使用带"b"的二进制模式(如"rb"、"wb+"),避免文本模式下的换行符转换问题。
2.2 文件读写操作
读写操作看似简单,但缓冲区管理是关键:
c复制size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
常见误区是认为count参数可以随意设置。实际上,最佳实践是:
- 读取时:
size设为单个元素大小,count设为预期元素数量 - 写入时:保持与读取时相同的结构
c复制// 错误示范:结构体写入
struct Data { int id; char name[32]; };
Data data;
fwrite(&data, 1, sizeof(Data), file); // 可读性差
// 正确示范
fwrite(&data, sizeof(Data), 1, file); // 明确表达写入1个Data结构
2.3 文件定位与错误处理
fseek和ftell是文件定位的核心:
c复制int fseek(FILE* stream, long offset, int origin);
long ftell(FILE* stream);
origin参数有三个标准值:
SEEK_SET:文
