二进制和文本方式打开文件的区别

本文探讨了处理二进制与文本文件时的区别,重点介绍了使用'r'与'rb'模式打开文件的不同之处。文章指出'r'模式在遇到'0x1A'时视为文件结束,而'rb'模式不受此限制;此外,还讨论了不同模式下对换行符处理的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二进制文件处理时会碰到的问题

我们使用处理二进制文件时,需要用如下方法

binfile=open(filepath,'rb')    读二进制文件

binfile=open(filepath,'wb')    写二进制文件

那么和binfile=open(filepath,'r')的结果到底有何不同呢?

不同之处有两个地方:

第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。

第二,对于字符串x='abc\ndef',我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是'0X0A'。当我们用'w'即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。linux下不会变。因为linux只使用'0X0A'来表示换行。

### 文本模式与二进制模式打开文件区别及适用场景 #### 区别 在 C 其他编程语言中,文件可以通过两种主要模式打开文本模式二进制模式。 1. **文本模式** 当以文本模式打开文件时,文件的内容会被视为一系列字符,并可能经历某些平台特定的转换。例如,在 Windows 平台上,换行符 `\n` 可能会被自动替换为回车换行组合 `\r\n` 或反之亦然[^1]。这种行为使得文本模式适合于处理纯文本文件,因为这些转换有助于跨不同操作系统保持一致性。然而,对于非文本数据(如图片、音频或其他二进制格式),这样的转换可能会破坏原始数据结构。 2. **二进制模式** 使用二进制模式打开文件意味着不会对文件内容执行任何特殊处理或转换。所有的字节都会按原样读取或写入磁盘[^5]。因此,当需要精确控制数据传输或者正在处理的是非文本类型的文件(比如图像、视频或者其他任何形式的二进制对象)时,应该采用此模式来避免不必要的修改。 #### 用法示例 以下是分别展示如何在 C 中使用这两种模式的例子: ##### 文本模式下的文件操作 (C) ```c #include <stdio.h> int main() { FILE *file; char buffer[100]; file = fopen("example.txt", "rt"); // 't' 表明这是文本模式,默认情况下也可以省略't' if(file != NULL){ while(fgets(buffer, sizeof(buffer), file)){ printf("%s", buffer); } fclose(file); }else{ perror("Error opening file"); } return 0; } ``` 上述代码片段演示了怎样以只读的方式打开名为 `example.txt` 的文本文件并逐行打印其内容至标准输出设备[^4]。 ##### 二进制模式下的文件操作 (C/C++) 下面是一个简单的例子说明如何创建一个新的二进制文件并将整型数组保存进去: ```cpp #include <fstream> using namespace std; int main(){ int data[] = {1, 2, 3}; ofstream outFile("data.bin", ios::out | ios::binary); if(outFile.is_open()){ outFile.write(reinterpret_cast<char*>(data), sizeof(data)); outFile.close(); } else { cout << "Unable to open file"; } return 0; } ``` 这里我们利用 C++ 的 fstream 库函数实现了向新建立的二进制文件 “data.bin” 写入三个连续存储单元的过程[^3]。 #### 适用场景分析 - 如果目标是对常规的人类可阅读材料进行基本的操作——像编辑器程序那样加载文档或将日志记录到硬盘上,则应优先考虑运用文本模式。 - 对于那些涉及多媒体资源管理的任务或者是涉及到序列化复杂的数据结构的应用场合而言,由于它们往往依赖确切无误地复制位串的能力,所以更倾向于选用二进制模式来进行相应的 I/O 处理工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值