以二进制方式打开文件_文件的打开和关闭

文件的打开

354e1f7f284a86ff4459285bdab54146.png

操作文件时需要用到缓冲区以及 FILE 类型变量,这就出现了一个问题:结构体 变量和缓冲区如何分配?结构体变量怎样存储缓冲区及文件的信息?这些工作需要 程序员自己编程来完成?

这些显然不需要程序员自己编程来完成的。根据经验,凡是常用的操作,系统 都已经给我们编好程序或者准备好函数了,这个函数就是 fopen()。

fopen()函数

作用:

(1) 在内存中给被操作文件分配缓冲区并且开辟一个 FILE 类型变量;

(2) 把文件信息及缓冲区信息存入 FILE 型变量中;

(3) 返回 FILE 型变量的首地址。

打开文件实际上就是调用 fopen()函数完成上面所说的工作。而接下来的读写操 作,则可由一些读写函数去完成。

函数原型

2dff0c6d8dddfa8a9f67b062421b5ed9.png

该函数有返回值,返回的是内存中所分配的 FILE 变量的首地址(若打开文件不 成功,则返回 NULL(NULL是0,是stdlib.h中定义的宏))所以要在打开文件前先定义一个FILE *型的变量

mode指的是文件的打开方式。

文件的打开方式

d8c8dfc01cabb824e99770146c7edb0f.png

使用追加方式打开文件时,读写的当前位置指针指向文件尾,而其他打开方式 都是指向文件头,这意味着如果用非追加方式打开文件写数据将把文件原有的内容 覆盖。

上面的 12 种打开方式,其中有 6 种后面带字母 b 的,6 种带 t 的。带 b 的打 开方式,通常用于二进制文件,所以叫做二进制方式打开;带 t 的通常用于文本文件, 所以叫做文本方式打开。

实际上,用二进制方式既可以打开二进制文件,也可以打开文本文件,同样,文本方式既可以打开文本文件,也可以打开二进制文件,一般不这样做。

用带"+"的打开方式打开文件后可以又读又写,但在读写操作转换时要调用fseek(),rewind(),fflush()函数,否则转换后的操作无效。

文件两种打开方式t,b的起源


插播:回车和换行的起源

计算机还没有出现之前,有一个东西叫做“电传打字机”(Teletype Model 33),每秒钟可以打十个字符(每个字符0.1s),但是它有一个问题,就是打完一行换行的时候,要用0.2s的时间。

如果在这0.2s中有字符传来,那么这两个字符将丢失(没有缓存,也没办法先存起来。)

于是想出了一个办法:字符发送方在发送信息时,在每行后面加两个表示结束的字符(正好可以填补0.2s的空隙)。这两个字符一个称为“回车”,告诉打字机把打印头定位在左边界,另一个称为“换行”,告诉打字机把纸向上移动一行。


后来,计算机发明了,这两个概念被搬到了计算机上。

那时存储器很贵,有些人认为,在每行结尾加两个字符太浪费了,加一个就可以。

也有些人觉得无所谓,于是,就出现了不同的规定。

不同操作系统对换行有着不同的规定。

UNIX规定,每行结尾只存一个字符'',就可以实现换行的功能。

Windows规定,每行结尾需要存'',''两个字符,才可以实现换行的功能。

Mac OS规定,每行结尾只存一个'',就可以实现换行的功能。

上述3种不同的规定所导致的直接后果是UNIX/Mac OS下的文件若在Windows中打开,所有文字会变成一行;

而Windows中的文件在UNIX/Mac OS下打开的话,在每行的结尾可能会多出一个不可识别的符号。

在Windows中用记事本等软件打开文本文件阅读时,之所以能看到换行,是因为该行末尾存有回车和换行两个字符。

C程序中,若要实现换行,只输出一个''即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值