第十三章 文件.docx
- 文档编号:10956847
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:17
- 大小:44.63KB
第十三章 文件.docx
《第十三章 文件.docx》由会员分享,可在线阅读,更多相关《第十三章 文件.docx(17页珍藏版)》请在冰豆网上搜索。
第十三章文件
第十三章文件
§13.1C文件概述
所谓文件一般指存储在外部介质(如磁盘磁带)上数据的集合.
操作系统是以文件为单位对数据进行管理的.
文件的分类
从用户观点:
特殊文件(标准输入输出文件或标准设备文件)
普通文件(磁盘文件)
从操作系统的角度看,每一个与主机相连的输入输出设备看作是一个文件。
例:
输入文件:
终端键盘
输出文件:
显示屏和打印机
按数据的组织形式:
ASCII文件(文本文件):
每一个字节放一个ASCII代码
二进制文件:
把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放.
例:
整数10000在内存中的存储形式以及分别按ASCII码形式和二进制形式输出如下图所示:
ASCII文件和二进制文件的比较:
ASCII文件便于对字符进行逐个处理,也便于输出字符。
但一般占存储空间较多,而且要花费转换时间。
二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存。
C语言对文件的处理方法:
缓冲文件系统:
系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。
用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。
非缓冲文件系统:
系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。
用非缓冲文件系统进行的输入输出又称为低级输入输出系统。
说明:
在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件.
ANSIC标准只采用缓冲文件系统来处理文本文件和二进制文件.
C语言中对文件的读写都是用库函数来实现.
§13.2文件类型指针
TurboC在stdio.h文件中有以下的文件类型声明:
typedefstruct
{shortlevel;/*缓冲区“满”或“空”的程度*/
unsignedflags;/*文件状态标志*/
charfd;/*文件描述符*/
unsignedcharhold;/*如无缓冲区不读取字符*/
shortbsize;/*缓冲区的大小*/
unsignedchar*buffer;/*数据缓冲区的位置*/
unsignedar*curp;/*指针,当前的指向*/
unsignedistemp;/*临时文件,指示器*/
shorttoken;/*用于有效性检查*/}FILE;
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息.
FILE类型的数组:
FILE f[5];定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。
文件型指针变量:
FILE*fp;fp是一个指向FILE类型结构体的指针变量。
可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。
如果有n个文件,一般应设n个指针变量,使它们分别指向n个文件,以实现对文件的访问。
§13.3文件的打开与关闭
一.文件的打开(fopen函数)
函数调用:
FILE*fp;
fp=fopen(文件名,使用文件方式);
①需要打开的文件名,也就是准备访问的文件的名字;
②使用文件的方式(“读”还是“写”等);
③让哪一个指针变量指向被打开的文件。
文件使用方式 含 义
“r”(只读)为输入打开一个文本文件
“w”(只写)为输出打开一个文本文件
“a”(追加)向文本文件尾增加数据
“rb”(只读)为输入打开一个二进制文件
“wb”(只写)为输出打开一个二进制文件
"ab“(追加)向二进制文件尾增加数据
"r+“(读写)为读/写打开一个文本文件
"w+”(读写)为读/写建立一个新的文本文件
"a+”(读写)为读/写打开一个文本文件
"rb+“(读写)为读/写打开一个二进制文件
“wb+“(读写)为读/写建立一个新的二进制文件
“ab+”(读写)为读/写打开一个二进制文件
二.文件的关闭(fclose函数)
函数调用:
fclose(文件指针);
函数功能:
使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作返回值:
关闭成功返回值为0;否则返回EOF(-1)
§13.4文件的读写
一.字符输入输出函数(fputs()和fgets())
fputs函数
函数调用:
fputs(ch,fp);
函数功能:
将字符(ch的值)输出到fp所指向的文件中去。
返回值:
如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF.
fgets函数
函数调用:
ch=fgets(fp);
函数功能:
从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。
返回值:
读取成功一个字符,赋给ch。
如果遇到文件结束符,返回一个文件结束标志EOF。
常见的读取字符操作
从一个文本文件顺序读入字符并在屏幕上显示出来:
ch=fgetc(fp);
while(ch!
=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
注意:
EOF不是可输出字符,因此不能在屏幕上显示。
由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。
当读入的字符值等于-1时,表示读入的已不是正常的字符而是文件结束符。
从一个二进制文件顺序读入字符:
while(!
feof(fp))
{
ch=fgetc(fp);
}
注意:
ANSIC提供一个feof()函数来判断文件是否真的结束。
如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。
以上也适用于文本文件的读取。
#include
#include
voidmain(void)
{FILE*fp;
charch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL){
printf("cannotopenfile\n");
exit(0);/*终止程序*/}
ch=getchar();/*接收执行scanf语句时最后输入的回车符*/
ch=getchar();/*接收输入的第一个字符*/
while(ch!
='#'{
fputc(ch,fp);putchar(ch);
ch=getchar();}
fclose(fp);
}
运行情况如下:
file1.c(输入磁盘文件名)
computerandc#(输入一个字符串)
computerandc(输出一个字符串)
#include
#include
main()
{FILE*in,*out;
charch,infile[10],outfile[10];
printf("Entertheinfilename:
\n");
scanf("%s",infile);
printf("Entertheoutfilename:
\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{printf("cannotopeninfile\n");
exit(0);}
if((out=fopen(outfile,"w"))==NULL)
{printf("cannotopenoutfile\n");
exit(0);}
while(!
feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);}
运行情况如下:
Entertheinfilename
file1.c(输入原有磁盘文件名
Entertheoutfilename:
file2.c (输入新复制的磁盘文件名)
程序运行结果是将file1.c文件中的内容复制到file2.c中去。
#include
#include
main(intargc,char*argv[])
{FILE*in,*out;
charch;
if(argc!
=3)
{printf("Youforgottoenterafilename\n");
exit(0);}
if((in=fopen(argv[1],"rb"))==NULL)
{printf("cannotopeninfile\n");
exit(0);}
if((out=fopen(argv[2],"wb"))==NULL)
{printf("cannotopenoutfile\n");
exit(0);}
while(!
feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);}
运行方法:
设经编译连接后得到的可执行文件名为a.exe,则在DOS命令工作方式下,可以输入以下的命令行:
C>a file1.c file2.c
file1.c和file2.c,分别输入到argv[1]和argv[2]中,argv[0]的内容为a,argc的值等于3。
二.数据块读写函数(fread()和fwrite())
函数调用:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
参数说明:
buffer:
是一个指针。
对fread来说,它是读入数据的存放地址。
对fwrite来说,是要输出数据的地址(均指起始地址)。
size:
要读写的字节数。
count:
要进行读写多少个size字节的数据项。
fp:
文件型指针。
使用举例:
若文件以二进制形式打开:
fread(f,4,2,fp);
此函数从fp所指向的文件中读入2个4个字节的数据,存储到数组f中。
使用举例:
若有如下结构类型:
structstudent_type
{charname[10];
intnum;
intage;
charaddr[30];}stud[40];
可以用fread和fwrite来进行数据的操作:
for(i=0;i<40;i++)
fread(&stud[i],sizeof(structstudent-type),1,fp);
for(i=0;i<40,i++)
fwrite(&stud[i],sizeof(structstudent-type),1,fp);
使用举例:
例13.3从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。
#include
#defineSIZE4
structstudent_type
{charname[10];
intnum;
intage;
charaddr[15];
}stud[SIZE];/*定义结构*/
voidsave()
{FILE*fp;
inti;
if((fp=fopen("stu-list","wb"))==NULL)
{printf("cannotopenfile\n");
return;}
for(i=0;i if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)! =1) printf(“filewriteerror\n”);/*出错处理*/ fclose(fp);}/*关闭文件*/ main() {inti; for(i=0;i scanf("%s%d%d%s",stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr); save();}/*调用save()保存学生信息*/ 运行情况如下: 输入4个学生的姓名、学号、年龄和地址: Zhang 1001 19 room-101 Fun100220room-102 Tan100321room-103 Ling100421room-104 #include #defineSIZE4 structstudent_type {charname[10]; intnum; intage; charaddr[15]; }stud[SIZE]; main() {inti; FILE*fp; fp=fopen("stu-list","rb"); for(i=0;i {fread(&stud[i],sizeof(structstudent_type),1,fp); printf("%\-10s%4d%4d%\-15s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr);} fclose(fp);} 屏幕上显示出以下信息: Zhang100119room-101 Fun100220room-102 Tan100321room-103 Ling100421room-104 如果已有的数据已经以二进制形式存储在一个磁盘文件“stu-dat”中,要求从其中读入数据并输出到“stu-list”文件中,可以编写一个load函数,从磁盘文件中读二进制数据。 voidload() {FILE*fp;inti; if((fp=fopen("stu-dat","rb"))==NULL) {printf("cannotopeninfile\n"); return;} for(i=0;i if(fread(&stud[i],sizeof(structstudent_type),1,fp)! =1) {if(feof(fp)){fclose(fp);return;} printf("filereaderror\n");} fclose(fp); 三.格式化读写函数(fprintf()和fscanf()) 函数调用: fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列); 函数功能: 从磁盘文件中读入或输出字符。 例: fprintf(fp,”%d,%6.2f”,i,t); Fscanf(fp,”%d,%f”,&i,&t); 注意: 用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。 因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。 三.其他读写函数 putw()和getw() 函数调用: putw(inti,FILE*fp); inti=getw(FILE*fp); 函数功能: 对磁盘文件中读写一个字(整数)。 例: putw(10,fp); i=getw(fp); gutw函数定义如下: gutw(FILE*fp) { chars; s=char*&i; s[0]=getc(fp); s[1]=getc(fp); returni; } 用户自定义读取其他类型数据的函数 向磁盘文件写一个实数(用二进制方式)的函数putfloat: putfloat(floatnum,FILE*fp) { chars; intcount; s=(char*)# for(count=0;count<4;count++) putc(s[count],fp); } fgets函数 函数作用: 从指定文件读入一个字符串。 函数调用: fgets(str,n,fp);从fp指向的文件输入n-1个字符,在最后加一个’\0’ 返回值: str的首地址 fputs函数 函数作用: 向指定的文件输出一个字符串。 函数调用: fgets(“china”,fp); 第一个参数可以是字符串常量、字符数组名或字符型 指针。 字符串末尾的′\0′不输出。 返回值: 输入成功,返回值为0;输入失败,返回EOF. §13.5文件的定位 #include main() {FILE*fp1,*fp2; fp1=fopen("file1.c","r"); fp2=fopen("file2.c","w"); while(! feof(fp1))putchar(getc(fp1)); rewind(fp1); while(! feof(fp1)) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); } 顺序读写和随机读写 顺序读写: 位置指针按字节位置顺序移动。 随机读写: 读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读些文件中任意位置上所需要的字符(字节)。 fseek函数(一般用于二进制文件) 函数功能: 改变文件的位置指针 函数调用形式: fseek(文件类型指针,位移量,起始点) 起始点: 文件开头SEEK_SET0 文件当前位置SEEK_CUR1 文件末尾SEEK_END2 位移量: 以起始点为基点,向前移动的字节数。 一般要求为long型 fseek函数应用举例 fseek(fp,100L,0);将位置指针移到离文件头100个字节处 fseek(fp,50L,1);将位置指针移到离当前位置50个字节处 fseek(fp,50L,2);将位置指针从文件末尾处向后退10个字节 #include #include structstudent_type {charname[10]; intnum; intage; charsex; }stud[10];main() {inti; FILE*fp; if((fp=fopen("stud-dat","rb"))==NULL) {printf("cannotopenfile\n"); exit(0);} for(i=0;i<10;i+=2) {fseek(fp,i*sizeof(structstudent_type),0); fread(&stud[i],sizeof(structstudent_type),1,fp); printf(“%s%d%d%c\n”,stud[i].name, stud[i].num,stud[i].age,stud[i].sex);} fclose(fp)} ftell函数 函数作用: 得到流式文件中的当前位置,用相对于文件开头的位移量来表示。 返回值: 返回当前位置,出错时返回-1L。 应用举例: i=ftell(fp); if(i==-1L)printf(“error\n”); ferror函数 调用形式: ferror(fp); 返回值: 返回0,表示未出错;返回非0,表示出错。 在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。 在执行fopen函数时,ferror函数的初始值自动置为0。 §13.6出错的检测 clearerr函数 调用形式: clearerr(fp); 函数作用: 使文件错误标志和文件结束标志置为0。 只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。 §13.7文件输入输出小结 分类函数名功能 打开文件fopen()打开文件 关闭文件fclose()关闭文件 文件定位fseek()改变文件位置指针的位置 Rewind()使文件位置指针重新至于文件开头 Ftell()返回文件位置指针的当前值 文件状态feof()若到文件末尾,函数值为真 Ferror()若对文件操作出错,函数值为真 Clearerr()使ferror和feof()函数值置零 文件读写fgetc(),getc()从指定文件取得一个字符 fputc(),putc()把字符输出到指定文件 fgets()从指定文件读取字符串 fputs()把字符串输出到指定文件 getw()从指定文件读取一个字(int型) putw()把一个字输出到指定文件 fread()从指定文件中读取数据项 fwrite()把数据项写到指定文件中 fscanf()从指定文件按格式输入数据 fprintf()按指定格式将数据写到指定文件中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十三章 文件 第十三