文件读取
fopen()
ifstream
stat
三种获取文件大小的方式对比:
| 特性/方式 | fseek + ftell |
std::ifstream::seekg + tellg |
stat / fstat |
|---|---|---|---|
| 📦 所属标准 | C 标准库 | C++ 标准库 | POSIX / 系统 API |
| 🖼️ 面向风格 | 面向过程 | 面向对象 | 系统底层/通用工具 |
| 📁 是否打开文件内容 | ✅ 是(fopen) |
✅ 是(ifstream) |
❌ 否(仅读元数据) |
| 🧠 是否读取文件内容 | ❌ 否(仅指针跳转) | ❌ 否 | ❌ 否 |
| 🧪 是否可用于设备/管道 | ❌ 否(对设备 seek 会失败) | ❌ 否 | ✅ 可用于一切 inode 类型 |
| 🧱 底层效率 | 高 | 稍慢(多了 C++ 抽象) | 最高(无需打开文件) |
| 📦 文件必须存在 | ✅ 是 | ✅ 是 | ✅ 是 |
| ⚠️ 异常处理 | 返回错误码 | 支持异常和 fail() 检查 |
返回 -1,设置 errno |
| 🔁 可移植性(跨平台) | ✅ 高(标准 C) | ✅ 高(标准 C++) | ❌ Windows 上需 _stat 等 |
| ✅ 推荐使用场景 | C/C++ 中手动文件操作 | C++ 风格封装、RAII | 获取文件元信息/无需读文件 |
fopen 第二个参数:
| 模式 | 含义 | 如果文件不存在 | 如果文件存在 |
|---|---|---|---|
"r" |
只读(文本) | 打开失败 | 成功打开 |
"r+" |
读写(文本) | 打开失败 | 成功打开 |
"w" |
只写(文本) | 创建新文件 | 清空原内容 |
"w+" |
读写(文本) | 创建新文件 | 清空原内容 |
"a" |
只追加写(文本) | 创建新文件 | 写操作追加到末尾 |
"a+" |
读/追加写(文本) | 创建新文件 | 读写允许,写总追加 |
添加 二进制模式 的组合,只需在模式字符串中加一个 "b",例如:
| 模式 | 含义 |
|---|---|
"rb" |
以二进制方式只读 |
"wb" |
二进制写入(覆盖) |
"ab" |
二进制追加 |
"r+b" |
二进制读写(不清空) |
"w+b" |
二进制读写(会清空) |
"a+b" |
二进制读+追加写 |
| 注意:Windows 系统中必须指定 "b" 模式 读写二进制文件(否则换行符会自动转换);Linux 下 b 是可选的。 |
二进制模式 vs 文本模式 的区别:
| 比较项 | 文本模式 ("r", "w" 等) |
二进制模式 ("rb", "wb" 等) |
|---|---|---|
| 换行处理 | Windows:\r\n 会转为 \n ;写入时 \n 可能被转为 \r\n |
数据原样处理,不转换换行符 |
| EOF 处理 | Windows 上某些字符(如 Ctrl+Z)会被视为文件结束符 | 不会有额外的 EOF 处理 |
| 字符编码 | 可能和环境编码有关(某些平台) | 字节就是字节,保持原样 |
| 适合操作 | 文本数据(如 .txt, .csv) |
图像、音频、压缩包、自定义结构体等 |
浙公网安备 33010602011771号