c语⾔使⽤⽂件⼀般步骤,C语⾔之路---⽂件操作
⼀、⽂件概述
C语⾔处理输⼊和输出,是采⽤“流“的形式,⽽且常常会有缓冲区,缓冲区的存在可以提⾼输⼊/输出处理的⾼效性,
在程序中,当调⽤输⼊函数从外部⽂件中输⼊数据赋给程序中的变量时,这种操作称为“输⼊”或“读”;      例: printf();
当调⽤输出函数把程序中变量的值输出到外部⽂件中时,这种操作称为“输出”或“写”。                          例:scanf();
对⽂件输⼊、输出⽅式也称“存取⽅式”。
⼆、⽂件类型指针
在C语⾔的缓冲⽂件系统中,⽤⽂件类型指针来标识⽂件。所谓⽂件指针,实际上是指向⼀个结构体类型的指针变量,这个结构体中包含有⽂件的⼀些信息,如缓冲区的地址,在缓冲区中当前存取的字符的位置,对⽂件是“读”还是“写”,是否出错,是否已经遇到⽂件结束标志等信息。此结构体类型名为FILE,可以⽤此类型来定义⽂件指针。定义⽂件类型指针变量的⼀般形式为:
FILE *变量名表;
【例如】
FILE *fp1,*fp2;
这⾥fp1和fp2均被定义为指向⽂件类型的指针变量,称为⽂件指针。
①⽂件指针⽤于指向⼀个⽂件,实际上是⽤于存放⽂件缓冲区的⾸地址。在缓冲⽂件系统中可以进⾏⽂件的打开、关闭、读、写、定位等操作。要对⽂件进⾏相应的操作,必须先定义⼀个指向⽂件的指针。
②结构类型名“FILE”必须⼤写。
③⼀般来说,对⽂件操作有以下3个步骤。
【步骤1】打开⽂件,即在计算机内存中开辟⼀个缓冲区,⽤于存放被打开⽂件的有关信息。
【步骤2】⽂件处理,包括读写、定位等操作。
【步骤3】关闭⽂件,将缓冲区中的内容写回到磁盘,并释放缓冲区。
三、⽂件的打开与关闭
1)、⽂件的打开(fopen函数)
fread和fwrite的区别
C语⾔中打开⼀个⽂件通过系统函数fopen 实现,其调⽤的⼀般形式为:
FILE *fopen("⽂件名"," 操作⽅式");
等价于:
FILE *fp;
fp=fopen("⽂件名"," 操作⽅式");
①“⽂件名”是将要打开(或创建)的⽂件的名字,如果使⽤字符数组(或字符指针),则不使⽤双引号。
②fopen函数返回⼀个指向指定⽂件的⽂件指针。如果不能实现打开指定⽂件的操作,则fopen函数返回⼀个空指针NULL(其值在头⽂件stdio.h 中被定义为0)。
③⽤⽂件指针指向打开的⽂件后,就可以⽤它来访问该⽂件。为增强程序的可靠性,常⽤下⾯的⽅法打开⼀个⽂件:
if((fp=fopen(" ⽂件名"," 操作⽅式"))==NULL)
{
printf("can not open this file\n");
exit(0);
}
2)、⽂件的关闭(fclose函数)
对⼀个⽂件操作完成后,要将该⽂件关闭。“关闭”就是使⽂件指针变量不再指向该⽂件,也就是⽂件指针变量与⽂件“脱钩”,此后不能再通过该指针对原来与其相联系的⽂件进⾏读写操作。C语⾔中关闭⼀个⽂件通过系统函数fclose 实现,其调⽤的⼀般形式为:
fclose(⽂件指针);
①⽂件指针”是已经打开的⽂件的指针,如13.3.1 ⼩节中的⽂件指针fp。
②这个函数就是关闭“⽂件指针”所指向的⽂件。如果正常关闭了⽂件,则函数返回值为0;否则,返回值为⾮0。
fclose(fp);
这条语句就关闭了fp所指向的⽂件。
四、⽂件的读/写
⽂件被打开后可以对⽂件进⾏操作,⽂件的读/写操作是最常⽤的⽂件操作。C语⾔中,⽂件的读/写没有特定的输⼊/输出语句,它是通过C提供的库函数来实现的。⽂件读/写的操作有以下⼏种。
①读/写⽂件中的⼀个字符。
②读/写⼀个字符串
③读/写⼀个数据块。
④⽂件进⾏格式化读/写。
1)、字符读/写函数fputc和fgetc
fputc功能是将⼀个字符写到⽂件中,其调⽤的⼀般形式为:
fputc(字符数据,⽂件指针);
fgetc功能是从⽂件中读⼊⼀个字符,其调⽤的⼀般形式为:
fgetc(⽂件指针);
【例如】
char ch;
ch=fgetc(fp) ;
表⽰从⽂件fp中读⼀个字符,赋给变量ch,同时fp的读/写位置指针向前移动到下⼀个字符。
2)、字符串读/写函数fputs和fgets
fputs功能是向指定⽂件输出⼀个字符串,其调⽤的⼀般形式为:
fputs(字符串,⽂件指针);
fgets功能是从⽂件中读⼀个字符串,其调⽤的⼀般形式为:
fgets(str,n,fp);
3)、数据块读/写函数fread和fwrite
fread函数的功能是从⽂件中读取数据块,其调⽤的⼀般形式为:
fread(buffer,size,count,fp);
【说明】
①fp是⽂件指针;buffer是⼀个指针,⽤来存放输⼊数据块的⾸地址;size表⽰⼀个数据块的字节数;count表⽰要读取的数据块块数。
②此函数的功能是从fp所指向⽂件的当前位置开始,⼀次读⼊size个字节,重复count次,并将读⼊的数据存放到从buffer开始的内存中;同时,将读/写位置指针向前移动size×count个字节。
③如果调⽤fread函数成功,则函数返回值等于count。
fwrite函数的功能是向⽂件写数据块,其调⽤的⼀般形式为:
fwrite(buffer,size,count,fp);
【说明】
①fp是⽂件指针;buffer是⼀个指针,⽤来存放将要读取数据块的⾸地址;size表⽰⼀个数据块的字节数;count表⽰要写的数据块块数。
②此函数功能是从buffer开始,⼀次输出size个字节,重复count次,并将输出的数据存放到fp所指向的⽂件中;同时,将读/写位置指针向前移动size×count个字节。
③如果调⽤fwrite函数成功,则函数返回值等于count。
4)、格式化读/写函数fprintf和fscanf
fprintf函数只能向⽂本⽂件中输出数据。fprintf函数和printf函数相似,只是输出的内容将按格式存放到磁盘的⽂本⽂件中,⽽不是屏幕上。fprintf函数的调⽤形式如下:
fprintf(⽂件指针,格式控制字符串,输出项表);
fprintf(stdout,"%d %d",x,y);
fscanf函数只能从⽂本⽂件中按格式输⼊。fscanf函数和scanf函数相似,只是输⼊的对象是磁盘上⽂本⽂件中的数据,⽽不是键盘。fscanf函数的调⽤形式如下:
fscanf(⽂件指针,格式控制字符串,输⼊项表);
fscanf(fp,"%d%d",&a,&b);
5)、判断⽂件结束函数feof
feof 函数调⽤的⼀般形式为:
feof( ⽂件指针);
【说明】
①“⽂件指针”指向由fopen函数打开的⽂件。
②在执⾏读⽂件操作时,如果遇到⽂件尾,则函数返回逻辑真(1);否则,则返回逻辑假(0)。
③feof 函数同时适⽤于ASCII 码⽂件和⼆进制⽂件。
五、⽂件的定位
常⽤的3个⽂件定位函数:rewind、fseek 和ftell。
1)、rewind函数
rewind 函数的调⽤形式为:
rewind(fp);
【说明】此函数的功能是使⽂件的位置指针返回到⽂件头。其中fp必须是有效的⽂件指针,即它已经指向⼀个由fopen 打开的⽂件。
2)、 fseek函数
⽂件定位函数fseek⼀般⽤于⼆进制⽂件,其调⽤形式如下:
fseek(fp,offset,origin);
3)、ftell函数
另⼀个与⽂件读写位置相关的函数是ftell,其调⽤形式如下:ftell(fp);