C语言文件的输入与输出
一. 文件指针
每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文什状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。在sudio.h文件中有以下的文件类型声明:
typedef struct{
typedef struct{
short level; /*缓冲区“满”或“空”的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short bsize; /*缓冲区的大小*/
unsigned char *buffer;/*数据缓冲区的位置*/
unsigned char *curp; /*指针,当前的指向*/
unsigned istemp; /*临时文件,指示器*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short bsize; /*缓冲区的大小*/
unsigned char *buffer;/*数据缓冲区的位置*/
unsigned char *curp; /*指针,当前的指向*/
unsigned istemp; /*临时文件,指示器*/
short token; /*用于有效性检查*/
}FILE;
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息。
FILE类型的数组:FILE f[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息。
FILE类型的数组:FILE f[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。
有了文件指针类型,就可以用它来定义文件指针变量,用文件指针变量来访问文件,其形式为:FILE *指针变量名。例如:FILE *fp;其中fp是指向要访问文件的指针变量。例如,通过文件指针访问文件,有如下的访问:
FILE *fp;
fp=fopen(“”, “rb”);
ch=getc(fp);
第一行语句只定义了一个没有指向的文件指针fp,第二行是打开文件,并同时确定对访问文件的操作方式(此处对访问的文件只进行读操作),这时给文件结构中的成员信息赋值,并使fp指向文件,第三行是利用文件指针对文件进行操作,操作方式应当与打开文件时确定的方式一致(只读)。由此可以看出,操作文件过程中不出现对文件结构成员的访问语句。
如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,确定打开方式,利用有关函数对文件指针操作即可。例如:下面语句定义了三个文件指针,在程序中就可以处理三个不同的文件。
如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,确定打开方式,利用有关函数对文件指针操作即可。例如:下面语句定义了三个文件指针,在程序中就可以处理三个不同的文件。
FILE *fa,*fb,*fc;
二.文件的打开与关闭
2.1文件的打开(fopen函数)
打开文件的首要工作就是要改变文件的标志,使其由闭到开,并且把下面信息告诉编译系统:
①需要打开的文件名,也就是准备访问的文件的名字;
②使用文件的方式(“读”还是“写”等);
③让哪一个指针变量指向被打开的文件。
②使用文件的方式(“读”还是“写”等);
③让哪一个指针变量指向被打开的文件。
打开函数的原型是定义在stdio.h头文件中的fopen函数,其格式为: fopen(“文件名”,“使用文件方式”);
即:FILE=fopen(“文件名”,“使用文件方式”);
即:FILE=fopen(“文件名”,“使用文件方式”);
例如:fp=fopen(“file”, “r”);
它表示,要打开的文件名为file,操作方式为读入,fopen函数返回指向file文件的指针并赋值给指针变量fp,这样fp和文件file就建立了联系。文件名字符串允许带有路径,使用路径时,路径分隔符是“\” 而不是“\\”。
例如:FILE *fp,*fq;
fp=fopen(“student”,“w”);
fq=fopen(“D:liuli\student34”,“r”);
以上语句表明,在当前磁盘,当前目录下以只写方式打开一个新文件,并将该文件的内存存储的首地址赋予文件指针fp,再以只读方式打开D盘liuli子目录下名字为student34的已经存盘的旧文件,并将该文件的内存存储的首地址赋予文件指针fq。
注意:如果fopen函数调用失败,即文件打开失败,fopen函数将返回空指针NULL,NULL在头文件中被定义为0.
文件使用方式及含义
文件操作方式 | 含义 | 打开文件方式 |
“r” | 打开一个文本文件 | 只读 |
“w” | 打开一个文本文件 | 只写 |
“a”fgets和fgetc的区别 | 打开一个文本文件,向文本文件尾增加数据 | 追加 |
“rb” | 打开一个二进制文件 | 只读 |
“wb” | 打开一个二进制文件 | 只写 |
“ab” | 打开一个二进制文件,向二进制文件尾增加数据 | 追加 |
“r+” | 打开一个文本文件 | 读/写 |
“w+” | 建立一个新的文本文件 | 读/写 |
“a+” | 打开或生成一个文本文件 | 读/写 |
“rb++” | 打开一个二进制文件 | 读/写 |
“wb++” | 建立一个新的二进制文件 | 读/写 |
“ab++” | 打开或生成一个二进制文件 | 读/写 |
说明:
(1)用“r”方式打开文件的目的是为了从文件中读取数据,不能向文件写入数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件;否则出错。
(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立个新文件。
(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在;否则将得到出错信息。打开时,位置指针移到文件末尾。
(4)用"r+”、“w+”、“a+”方式打开的文件既可以用来输人数据,也可以用来输出数据。用"r+”方式时该文件应该已经存在,以便能向计算机输人数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。
(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用"r"方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.H头文件中已被定义为0)。
(1)用“r”方式打开文件的目的是为了从文件中读取数据,不能向文件写入数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件;否则出错。
(2)用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立个新文件。
(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在;否则将得到出错信息。打开时,位置指针移到文件末尾。
(4)用"r+”、“w+”、“a+”方式打开的文件既可以用来输人数据,也可以用来输出数据。用"r+”方式时该文件应该已经存在,以便能向计算机输人数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。
(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用"r"方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.H头文件中已被定义为0)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论