在C语言中,文件可以用二进制模式或文本模式打开,两者的主要区别在于数据处理的底层方式,尤其是在不同操作系统上的表现。具体为:
1. 核心区别
|
特性 |
文本模式 ( |
二进制模式 ( |
|
换行符处理 |
自动转换(如 |
原样读写,不做转换 |
|
数据解释 |
视为字符流(可能受编码影响) |
视为原始字节流 |
|
文件结尾符 |
可能处理EOF字符(如 |
无视EOF字符 |
|
适用场景 |
文本文件(如 |
非文本文件(如 |
2. 换行符的跨平台差异
- Unix/Linux/macOS:换行符为
\n - Windows:换行符为
\r\n
文本模式会自动转换:
- 写入时:程序中的
\n→ 存储为\r\n(Windows) - 读取时:文件中的
\r\n→ 转换为\n(程序内)
二进制模式则保持原样,不进行任何转换。
3. 文件结尾符(EOF)的特殊处理
仅Windows文本模式:
遇到 0x1A(Ctrl+Z)会视为文件结束(即使后面还有数据)。
// Windows文本模式下可能提前终止读取
FILE *fp = fopen("file.txt", "rt"); // 遇到0x1A停止
- 二进制模式:
会完整读取所有字节,无视0x1A。
4. 实际代码示例
文本模式(自动转换换行符)
FILE *fp = fopen("demo.txt", "w"); // 默认文本模式
fprintf(fp, "Line1\nLine2"); // Windows实际存储为"Line1\r\nLine2"
fclose(fp);
二进制模式(原始字节流)
FILE *fp = fopen("image.png", "rb"); // 二进制模式读取图片
unsigned char buffer[1024];
fread(buffer, 1, 1024, fp); // 直接读取字节,无转换
fclose(fp);
5. 其他注意事项
- 跨平台一致性:
-
- 在Unix/Linux中,文本模式和二进制模式无区别(因换行符均为
\n)。 - 在Windows中,处理文本文件时需显式指定模式(如
"rt"或"rb")。
- 在Unix/Linux中,文本模式和二进制模式无区别(因换行符均为
- 性能影响:
文本模式的换行符转换可能带来微小性能开销(但通常可忽略)。 - 标准函数行为:
-
fgets()/fputs:在文本模式下自动处理换行符。fread()/fwrite():通常用于二进制模式,直接操作字节。
6. 如何选择模式?
用文本模式:
处理人类可读的文本文件(如配置文件、日志)。
- fopen("config.ini", "r"); // 默认文本模式
用二进制模式:
处理非文本文件(如图片、视频、压缩包)或需要精确控制字节的场景。
- fopen("data.bin", "wb"); // 二进制写入
1171

被折叠的 条评论
为什么被折叠?



