文件读取

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 图像、音频、压缩包、自定义结构体等
posted @ 2025-07-02 11:12  卑以自牧lq  阅读(14)  评论(0)    收藏  举报