文件的打开
操作文件时需要用到缓冲区以及 FILE 类型变量,这就出现了一个问题:结构体 变量和缓冲区如何分配?结构体变量怎样存储缓冲区及文件的信息?这些工作需要 程序员自己编程来完成?
这些显然不需要程序员自己编程来完成的。根据经验,凡是常用的操作,系统 都已经给我们编好程序或者准备好函数了,这个函数就是 fopen()。
fopen()函数
作用:
(1) 在内存中给被操作文件分配缓冲区并且开辟一个 FILE 类型变量;
(2) 把文件信息及缓冲区信息存入 FILE 型变量中;
(3) 返回 FILE 型变量的首地址。
打开文件实际上就是调用 fopen()函数完成上面所说的工作。而接下来的读写操 作,则可由一些读写函数去完成。
函数原型
该函数有返回值,返回的是内存中所分配的 FILE 变量的首地址(若打开文件不 成功,则返回 NULL(NULL是0,是stdlib.h中定义的宏))所以要在打开文件前先定义一个FILE *型的变量
mode指的是文件的打开方式。
文件的打开方式
使用追加方式打开文件时,读写的当前位置指针指向文件尾,而其他打开方式 都是指向文件头,这意味着如果用非追加方式打开文件写数据将把文件原有的内容 覆盖。
上面的 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程序中,若要实现换行,只输出一个''即可。