版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第72章文件类型
第12章文件类型
12」文件类型与文件指针
12.2文件的打开与关闭
12.3文件的读写与建立
12.4文件辅助操作
12.5程序设计举例
第72章文件类型
12.1文件类型与文件指针
1.文本文件和二进制文件
c语言文件把数据看作是一连串的字符(字节)。
c语言文件是一个字符(字节)的序列,是一字符流或
字节流,是一种流式文件。根据数据的组织形式,可
分为文本文件和二进制文件。
第72章文件类型
文本文件又称为ASCII文件,每一个字节中存放一
个ASCII代码,代表一个字符。例如,一个整数123,
若用ASCII文件存放,占3个字节的存储单元,1、2、
3各用一个字节存储。而1、2、3的ASCII码分别为49、
50、51,故123用ASCII文件存放时,存放形式为
OOllOOOlOOllOOlOOOllOOllo
二进制文件是直接用数据的二进制形式存放。例
如,对整数整3,二进制为0000000001111011,用二进
制文件存放,需2个字节,存放形式为
0000000001111011o
第72章文件类型
2.缓冲文件系统和非缓冲文件系统
在缓冲文件系统中,系统自动在内存中为每个正在
使用的文件开辟一个缓冲区,文件的存取都是通过缓冲
区进行的。缓冲区相当于一个中转站,它的大小由具体
的C版本规定,一般为512字节。缓冲文件系统原来用于
处理文本文件。
在非缓冲文件系统中,系统不为所打开的文件自动
开辟缓冲区,缓冲区的开辟由程序完成。非缓冲文件系
统原来用于处理二进制文件。
第72章文件类型
ANSIC不再采用非缓冲文件系统,而只采用缓冲
文件系统,在处理二进制文件时,也通过缓冲文件系
统进行。ANSIC通过扩充缓冲文件系统,使缓冲文件
系统既能处理文本文件,又能处理二进制文件。
第上章文件类型
3.内部文件和外部文件
存放在外部介质上的文件称为外部文件,通过文件
名标识。C程序中的文件称为内部文件,用文件指针来
描述。
程序中要实现对文件的处理,先必须在内部文件与
外部文件之间建立联系,打开文件;然后方可对文件进
行操作。文件最基本的操作是读写操作;操作完成应当
切断内部文件与外部文件之间的联系,关闭文件。
对文件进行的所有操作通过C编译系统提供的标准
函数完成,这些函数的信息包含在头文件“stdio.h”中。
第72章文件类型
12.1.2文件类型
文件类型是一特殊的结构体类型,一般命名为
FILEo用户可以直接使用FILE来定义文件类型变量,
存放要处理的文件的基本信息。
各种C编译系统的FILE定义可以不同,但均包含
进行文件操作所需的各种信息。
第72章文件类型
下面是TURBOC中对FILE的定义:
typedefstruct
{shortlevel;
unsignedflags;
charfd;
unsignedcharhold;
shortbsize;
unsignedchar"buffer;
unsignedchar*curp;
unsignedistemp;
shorttoken;
}FILE;
第72章文件类型
12.1.3文件指针变量
对文件的描述,往往通过指向文件的文件指针变量
来进行。文件指针变量定义的形式为:
FILE*文件指针变量;
例如:FILE*fp,*fpa[10];
定义了文件指针变量班和文件指针变量数组中a。文
件指针变量币及文件指针变量数组Sa的每个分量可以指
向一个文件的信息。
第72章文件类型
12.2文件的打开与关闭
12.2.1文件的打开
文件的打开用fopen()函数完成,调用方式通常
为:
fp=fopen(文件名,文件使用方式);
第72章文件类型
文件使用方式共有12种,用特定字符形成的字符串
来描述。
(1)"r"方式,以只读方式打开文本文件。
这时从文件中读数据到内存,故要求文件已经存在。
用〃r〃方式打开的文件只能读,不能同时写。
(2)〃w〃方式,以只写方式打开文本文件。
这时将内存中的数据写入到磁盘文件中。若文件不
存在,建立新文件;若文件存在,则刷新文件,重新建
立。用〃w〃方式打开的文件只能写,不能同时读。
第72章文件类型
(3)〃a〃方式,为文本文件的追加方式。
用于向已存在的文件尾部追加新的数据,而文件中原来
的数据不被破坏。
(4)〃r+"、〃w+〃、〃a+”方式,打开的文本文件既能读又能
同时写。
〃r+〃方式:在读的同时可以进行写。读写位置指针在头
部,若原来存在此文件,则以覆盖方式写。
"w+〃方式:在写的同时可以进行读。由于打开文件时,
文件原来的内容被刷新,一般不要在打开文件后立即读文
件。
〃a+J在追加的同时可以进行读。读文件时,从文件首
部开始;写文件时,在文件尾部追加。
第72章文件类型
(5)〃rb〃、〃wb”、〃ab〃、〃rb+〃、〃wb+〃、〃ab+〃是使用
二进制文件相应的六种方式。
打开文件可得到三个信息:
①要访问的文件名。
②使用文件的方式。
③哪一个指针变量用于指向被打开的文件。
打开成功,返回文件指针(文件信息区的起始地
址);不能打开,返回空指针。
第72章文件类型
例如:
(1)fp=fopen("student.dat","w");
以只写方式打开当前盘当前目录下的文本文件中的学
生数据文件,用户可将数据写入此磁盘文件中。
(2)fp=fopen("c:\cj\cjc.dat",student.dat","r");
以只读方式打开C盘成绩子目录下C语言成绩文件,
用户可将文件中数据读出来。但此文件必须存在,否则会
出错。
第72章文件类型
(3)fp=fopen(〃PRG〃,〃ab+");
打开二进制文件PRG,在读的同时也可以写。
为确保文件的读写操作,对文件是否已正常打开往
往加上if语句进行控制。例如:
if(fp=fopen(("student.dat","w")==NULL)
{printf("不能打开文件!”);
exit(0);
第72章文件类型
说明:
(1)不是所有编译系统均提供以上12种文件使用方式。
(2)用"r〃、"rb〃方式打开的文件必须已经存在。
(3)用"w"、"wb"方式打开的文件,可以存在也可以不
存在。不存在时,则新建文件;存在时,重新建立,原
文件内容不被保留。
(4)在读写文本文件时,对回车换行符要进行转换,
读时回车换行符转换成换行符,写时回车换行符转换成回
车、换行两个字符。对二进制文件,不进行这种转换。
第72章文件类型
(5)程序运行时,系统自动打开标准输入stdin、
标准输出stdout、标准出错输出stderr三个标准文件。
stdin>stdout>stderr由系统自动定义,可直接使用。
(6)标准设备文件可与普通文件一样操作,但将
产生特殊效果。如写到打印机,将在程序中实现打印
输出控制。
第72章文件类型
12.2.2文件的关闭
文件在使用完后,应及时关闭。文件的关闭用
fclose()函数完成,调用方式为:
fclose(文件指针变量);
关闭文件将使文件指针变量与文件名脱钩,即指针
变量不再指向该文件。文件关闭后不能再用该指针变量
对文件进行操作,该指针变量可再指向其它文件。
顺利执行了关闭操作,将返回函数值0。如返回一
个非0值,则表示文件关闭出错。
第72章文件类型
12.3文件的读写与建立
12.3.1字符级数据的读和写
1.字符级数据的读
函数原型:
intfgetc(FILE*fp);
功能:从文件指针中所指向的文件中读取一个字节的
代码值(字符),作为函数的返回值。正常情况下为一
个字符,读到文件尾或出错时为EOF(-1)o
第72章文件类型
说明:
(1)读完一字节数据后,文件指针自动后移。
(2)getc和鱼etc是等价的宏。
(3)若文件指针为stdin,贝悔etc(stdin)功能与
getchar()等价。
第72章文件类型
2.字符级数据的写
函数原型:
intfputc(intch,FILE*fp);
功能:将ch写入文件指针中所指向的文件中。写入
成功返回字符值,不成功返回值EOF。
说明:
(1)写入数据前,文件指针自动后移。
(2)puttc和finite是等价的宏。
(3)若文件指针为stdout,贝II币utc(stdout)功能与
puttchar()等价。
(4)文件的建立通过写操作完成。
第72章文件类型
12.3.2字级数据的读和写
1.字级数据的读
函数原型:
intgetw(FILE*fp);
功能:
从文件指针中所指文件中读一个字的数据(整
数),并以它作为函数的返回值。
说明:
非标准C所提供函数。
第72章文件类型
2.字节数据的写
函数原型:
intputw(intw,FILE*fp);
功能:
写一个字的数据(整数)到文件指针中所指的
文件中,并以它作为函数的返回值。
说明:非标准C所提供函数。
第72章文件类型
12.3.3字符串级数据的读和写
1.字符串数据的读
函数原型:
char*fgets(char*str,intlen,FILE*fp);
功能:
从文件指针S所指的文件中读入一个长度为len-1的
字符串,送入到str所指内存地址中。返回值为str的首地
址,若读到文件尾或出错,则返回值为NULL。
第72章文件类型
说明:
(1)字符串读入后在最后加结尾符,\0,。
(2)将读到的回车符作为字符存储。这点与gets()
函数不同,gets()把读到的回车符转换成结尾符。
(3)字符串数据的读和写亦称“行处理”。
第72章文件类型
2.字符串数据的写
函数原型:
intfputs(char*str,FILE*fp);
功能:
将str指针所指字符串写入到文件指针中所指文
件中。若该函数成功调用,返回函数值0,否则返
回函数值非0。
第72章文件类型
12.3.4数据块数据的读和写
1.数据块数据的读
函数原型:
unsignedfread(void*buffer,unsignedsize,unsigned
count,FILE*fp);
功能:从文件指针fjp所指的文件中读取count个大小为size
字节的数据块到buffer指针所指的内存中。读到的数据可
能含有各种不同的类型。若该函数成功调用,返回count
的值。
第72章文件类型
例如:
inta[100];
fread(a,2,100,fp);/*从中读取100个大小为
2字节的数据块(整数)到数组a中*/
第72章文件类型
2.数据块数据的写
函数原型:
unsignedfwrite(void*buffer,unsignedsize,unsignedcount,
FILE*fp);
功能:向文件指针中所指的文件写入由buffer指针所
标识的count个大小为size字节的数据块。若该函数成功
调用,返回count的值。例如:
inta[100];
fwrite(a,2,100,fp);/*将整个数组a写入文件中中*/
第72章文件类型
12.3.5格式化数据的读和写
函数原型:
intfscanf(FILE*fp,格式字串,变量地址表);
intfprintf(FILE*fp,格式字串,变量表);
使用fscanf()和币rintf()函数对磁盘文件进行读
和写,相当方便。但是输入时需将ASCII码转换为二进制,
输出时需将二进制转换成ASCII码,需花费较多的时间,
故一般较少采用,而是使用fread()和fwrite()函数。
第72章文件类型
例如:
inti,j;
floatf;
fscanf(fp,〃%d%d%P,&i,&j,&f);/*
从中中按指定格式读取数据至i、j、f中*/
第上章文件类型________________
12.3.6文件的建立步骤
对文件操作前必须打开文件,文件打开后才可进
行读写操作,操作完成应关闭文件。
文件的建立步骤如下:
(1)以写方式打开文件。
(2)将数据写入文件,多个数据反复写入。
(3)写完数据关闭文件。
第72章文件类型
例12-1定义一个函数,建立存放26个英文小写字母的文件LF.DAT。
voidcreatfile()
{char1;
FILE*fp;
if((fp=fopen("LF.DAT","w"))==NULL)/*打开文件*/
{printf("不能打开文件!");
exit(0);
}
fbr(l='a';1++)/*写入数据*/
fputc(1,fp);
fclose(fp);/*关闭文件*/
第72章文件类型
例12・2定义一个函数,建立存放某班50个同学姓名、
C语言成绩的数据文件CCJ.DAT,原始数据由数组参数传入。
voidcreatfile(floatx[])
{inti;
FILE*fp;
if((fp=fopen(〃CCJ.DAT〃,〃wb"))==NULL)/*打开文件*/
{printf("不能打开文件!”);
exit(0);
}
for(i=0;iv=50;i++)/*写入数据*/
fwrite(x+i,4,1,fp);
fclose(fp);/*关闭文件*/
第72章文件类型
写入数据也可以整体一次完成:
fwrite(x,4,50,fp);
⑴文件的建立在操作系统下可通过改向操作完成。
(2)数据源文件也可通过任何字处理软件建立。
(3)执行一个向打印机写的操作,可在程序中实现数据
的打印输出。
例如:
fp=fopen("PRN:","w");
fputs("HUNANCOMPUTER",fp);/*打印输出
HUNANCOMPUTER*/
打印输”也喈接住手系统
第72章文件类型
12.3.7文件的读取控制
while(fgetc(fp)!=EOF)
{读取数据}
或
while(!feof(fp))
{读取数据}
对于二进制文件,由于最后一个数据可能为-1
(EOF),最好用feof()函数判断。
第72章文件类型
例12-3从上例建立的文件CCJ.DAT中读出学生的C
语言成绩,求出每个学生与平均成绩之差。
/*程序12-3,求每个学生与平均成绩之差*/
structst
{char*name;
floatcj;
}C[200];
main()
{inti=0,n;
floatsum=0,av;
floatsav[200];
FILE*fp;
第72章文件类型
if((fp=fopen("CCJ.EAT",〃rb〃))==NULL)/*打开文件*/
{printf("不能打开文件!");
while(!feof(fjp))/*读数据,同时进行累加*/
{fread(c+i,4,1,fp);
sum+=c[i].cj;
i++;
}
n=i;
av=sum/n;/*求平均成绩*/
for(i=0;i<n;i++)/*求与平均成绩之差并输出*/
{sav[i]=c[i].cj-av;
printf("%s,%6.1f,c[i].name,c[i].cj,sav[i]);
第72章文件类型
12.4文件辅助操作
1.反绕函数
函数原型:
voidrewind(FILE*fp);
功能:使文件的读写位置指针返回文件开头。
第72章文件类型
2.随机定位函数
函数原型:
intfseek(FILE*fp,longintnumbytes,intorigin);
功能:将文件的位置指针移动numbytes个字节,
numbytes为正数表示后移,为负数表示前移。其中移动的
开始位置由origin确定,origin的值可以为0、1、2,或
SEEK-SET、SEEK-CUR、SEEK-END,分另U代表
“文件开头”、“当前位置”、“文件末尾”三个特殊位
置。________________________________
第72章文件类型
例如:
(1)fseek(fp,1001,0);/*将文件的位置指针
移动到离文件开头100个字节处*/
(2)fseek(fp,501,1);/*将文件的位置指针向
前移动50个字节处*/
(3)fseek(fp,-101,2);/*将文件的位置指针
向后移10个字节处*/利用随机定位函数实现对文件的随
机读写。
第72章文件类型
3.求当前读写位置函数
函数原型:
longintftell(FILE*fp);
功能:
得到文件的当前读写位置指针,用相对于文件开
头的位移量来表示。若出现调用错误,返回值为-1。
第72章文件类型
4.出错检测函数
函数原型:
intferror(FILE*fp);
功能:
检查文件中各种输入输出函数调用是否出错。
若得到的函数值为0,表示未出错;得到的函数值非
0,表示出错。
调用fopen()函数时,ferror初值自动置0。
第/Z章文件类型________________
5.初始化清零函数
函数原型:
voidclearerr(FILE*fp);
功能:
清除文件错误标志和文件结束,将文件错误标志和
文件结束标志置0。
输入输出函数调用出错后,出错标志一直保留,直到
对同一文件调用clearerr()函数、rewind()函数或任
一输入输出函数。
第72章文件类型
12.5程序设计举例
例12-4从键盘输入若干字符,存入某磁盘文件中,
然后从文件中读取数据打印输出。
/*程序12-4,输入若干字符至文件,并打印输出*/
main
{charch,*fhame;
FILE*fp,*pp;
scanf("%s",fname);/*输入磁盘文件名*/
/*建立文件*/
第72章文件类型
if((fp=fopen(fhame,"w"))==NULL)
{printf("文件不能打开!");
exit(0);
ch=getchar();
while(ch!='\n')
{fputc(ch,fp);
ch=getchar();
fblose(fp);
/*从刚建立的磁盘文件中读取数据,打印输出*/
if((fp=fbpen(fhame,"r"))==NULL)
{printf("数据文件不能打开!");
exit(0);
第72章文件类型
if((pp=fbpen("PRN:","w〃))==NULL)
{printf("打印机没能连接!〃);
exit(0);
}
ch=fgetc(fp);
while(!feof(fp))
{fprintf(pp,"%6c",ch)
ch=fgetc(fp);
fclose(fp);
fclose(pp);
第72章文件类型
例12・5学生信息包含有学号、姓名、年龄、成绩
及住址,从键盘输入n个学生的这些信息,然后存入一个
磁盘文件STUDENT.DAT中。
/*程序12-5,建立学生信息文件*/
#defineSIZE200
structstudent
{intnum;
char*name;
intage;
floatscore;
char*addr;
}stud[SIZE];
intn;
第72章文件类型
voidsave()/*建立文件STUDENT.DAT*/
{FILE*fp;
inti;
if((fp=fbpen("STUDENT.DAT",〃wb"))==NULL)
{printf("不能建立文件!");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)
{printf("文件不能写!\n");
exit(0);
}
第72章文件类型
fclose(fp);
}
main()
{inti;
scanf("%d",&n);
for(i=0;i<n;i++)/*从键盘输入数据*/
scanf("%d%s%d%f%s",&stud[i].mum,stud[i].name,
&stud[i].age,&stud[i].score,stud[i].addr);
save();/*调用函数建立文件*/
第72章文件类型
例12-6编写类似DOS拷贝命令的文件复制程序。
/*程序12-6,拷贝命令程序*/
main(intargc,char*argv[])
{inti;
FILE*fps,*fpt;
if(argc!=3)
{puts("命令行参数格式是:执行文件名源文件名目标文件名〃);
exit(0);
}
if((fps=fbpen(argv[1],"rb"))==NULL)
{printf("源文件不能打开!");
exit(0);
第72章文件类型
if((fpt=fbpen(argv[2],"wb"))==NULL)
{printf("目标文件不能建立!");
exit(0);
}
while(!feof(fps))
{fread(&i,2,1,fps);
fwrite(&i,2,1,fpt);
fclsoe(fps);
fclose(fpt);
第72章文件类型
例12-7对例11-5建立的磁盘文件STUDENT.DAT,
首先在屏幕上输出文件内容,然后使指针移到开头,实现
文件的复制。
/*程序12-7,文件的输出复制操作*/
#defineSIZE200
structstudent
{intnum;
char*name;
intage;
floatscore;
char*addr;
}stud;
第72章文件类型
main()
{FILE*fpl,*fp2;
char*tname;
inti=0;
if((fpl=fopen("STUDENT.DAT",〃rb"))=NULL)
{printf("不能打开文件!");
exit(0);
}
while(!feof(fpl))/*屏幕输出*/
{fread(&stud,sizeof(structstu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 充电桩工程与技术咨询服务2024年度合同
- 中秋的夜400字模板
- 高效会议管理的经验分享计划
- 花田转让合同范本
- 《清肤饮治疗湿热蕴肤型湿疹的临床研究》
- 手术室操作规范与个人成长目标计划
- 龙眼肉提物炎症抑制
- 银行账号冻结解封合同范本
- 班级学习小组组织方案计划
- 人教鄂教版科学【核心素养目标】4.13《呼吸器官》教案
- 《应用文书写作》课件
- 人教版化学九年级上册 第四单元复习教学设计
- MSOP(测量标准作业规范)测量SOP
- 【马工程笔记】第一章-民事诉讼法学概述
- 保险精算原理
- 养老院人力资源管理
- 敬老院设备采购投标方案(技术方案)
- 充电桩采购安装售后服务方案
- 生物技术对医疗行业的影响
- 第13课 清前中期的兴盛与危机
- 资产评估学教程(第八版)习题及答案 乔志敏
评论
0/150
提交评论