C语言中以文本/二进制模式打开文件的影响及函数适配问题
C语言文本模式与二进制模式的区别及函数适配问题
核心区别
两种模式的本质差异在于是否对字节流做特殊转换:
- Windows系统:文本模式下,写入时会将
\n(0x0A)转换为\r\n(0x0D0A);读取时则反向转换,把\r\n还原为\n。此外,文本模式会把字节0x1A(Ctrl+Z)视为文件结束标记,即使后续还有数据也会停止读取。 - 类Unix系统(Linux、macOS等):两种模式几乎无差异,因为系统本身用
\n作为换行符,也没有特殊的EOF标记字节。
fread/fwrite在文本模式下能用吗?
语法上完全允许调用,但不推荐用于二进制数据处理。
比如在Windows下用文本模式打开文件,调用fwrite写入包含0x0A的二进制数据时,这个字节会被自动替换为0x0D0A,导致文件体积变大、原始二进制结构被破坏;读取时,原本的0x0D0A字节序列会被替换为0x0A,如果你的二进制数据里刚好有这个组合(比如某些图片或音频的编码),就会导致数据解析错误。
如果是用fread/fwrite处理纯文本内容,文本模式也能工作,但这时候用fgets/fputs之类的文本函数会更贴合场景。
fscanf/fprintf在二进制模式下能用吗?
语法上也允许,但只有当文件内容本身是纯文本格式时才有意义。fscanf是按文本规则解析字节:比如读取整数时,它会把连续的数字字符(如"123")转换成对应的数值。如果你的文件是二进制格式(比如直接存储int的字节序列),fscanf会把这些二进制字节当作ASCII字符处理,结果完全错误——比如二进制的0x0000007B(对应十进制123)会被解析成空字符+{,根本读不出正确的整数。
反过来,fprintf在二进制模式下输出的是纯文本字符串,只是不会做换行符转换:比如在Windows下输出\n,二进制模式只会写入0x0A,而文本模式会写入0x0D0A。如果你的文件就是要存文本内容,这么做也能运行,但没必要,文本模式更符合预期。
两种模式打开文件的具体后果
文本模式
- 自动处理换行符,保证文本内容在不同系统下的换行显示一致(仅限Windows和类Unix之间的兼容)。
- Windows下会提前终止读取遇到
0x1A的文件,可能丢失后续数据。 - 适合处理
.txt、.c、.h等纯文本格式文件,搭配fscanf/fprintf、fgets/fputs等文本操作函数更安全。
二进制模式
- 完全按原始字节读写,不做任何转换,保证数据的完整性。
- 不会将任何字节视为特殊EOF标记,只有真正到文件末尾才会停止读取。
- 适合处理图片、音频、可执行程序、自定义二进制格式文件,用
fread/fwrite能精准操作每个字节。
内容的提问来源于stack exchange,提问作者Zaratruta
相关产品推荐
相关产品推荐

