版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1c语言学习c语言第12章12.1C语言文件概述1.文件与文件名
文件是指存放在外部存储介质上的数据集合。为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名[.扩展名]
文件命名规则,遵循操作系统的约定。2.文件分类可以从不同的角度对文件进行分类:(1)根据文件的内容,可分为程序文件和数据文件,程序文件又可分为源文件、目标文件和可执行文件。(2)根据文件的组织形式,可分为顺序存取文件和随机存取文件。12.1.1文件的概念及分类
第1页/共41页(3)根据文件的存储形式,可分为ASCII码文件和二进制文件。
ASCII码文件的每1个字节存储1个字符,因而便于对字符进行逐个处理。但一般占用存储空间较多,而且要花费转换时间(二进制与ASCII码之间的转换)。二进制文件是把内存中的数据,原样输出到磁盘文件中。可以节省存储空间和转换时间,但1个字节并不对应1个字符,不能直接输出字符形式。第2页/共41页12.1.2文件的操作流程
通过程序对文件进行操作,达到从文件中读数据或向文件中写数据的目的,涉及到的操作有:建立文件、打开文件、从文件中读数或向文件中写数、关闭文件等。一般遵循的步骤为: (1)建立/打开文件 (2)从文件读取数据或向文件写数据。 (3)关闭文件第3页/共41页
打开文件是进行文件读写操作之前的必要步骤。打开文件就是将指定的文件与程序联系起来,为下面进行的文件读写做好准备。当为进行写操作而打开一个文件时,如果这个文件不存在,则系统会建立这个文件,并打开它。当为进行读操作而打开一个文件时,文件应该是已经存在的,否则会出错。所谓读文件是指,将磁盘文件中的数据传送到计算机内存的操作。所谓写文件是指,从计算机内存向磁盘文件中传送数据的操作。关闭文件就是取消程序与指定的数据文件之间的联系,表示文件操作的结束。第4页/共41页所谓缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。从磁盘文件向内存读入数据时,则正好相反:首先将一批数据读入到缓冲区中,再从缓冲区中将数据逐个送到程序数据区。12.1.3缓冲文件系统与非缓冲文件系统
1.缓冲文件系统
第5页/共41页所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快。在过去使用的C版本(如UNIX系统下使用的C)支持上述两种对文件处理的方法,但是ANSIC标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。
2.非缓冲文件系统
第6页/共41页12.1.4文件指针
ANSIC为每个被使用的文件在内存开辟一块用于存放上述信息的小区,利用一个结构体类型的变量存放。该变量的结构体类型由系统取名为FILE,在头文件stdio.h中定义如下:typedefstruct{shortlevel;/*缓冲区“满”或“空”的程度*/unsignedflages;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*baffer;/*缓冲区的读写位置*/unsignedchar*curp;/*文件读写位置*/unsignedistemp;/*临时文件,指示器*/shorttoken;/*用于有效性的检查*/}FILE;
第7页/共41页在操作文件以前,应先定义文件类型的指针,定义的一般格式:FILE*指针变量标识符例如:FILE*fp1,*fp2;
按照上面的定义,fp1和fp2均为指向结构体类型的指针变量,分别指向一个可操作的文件,换句话说,一个文件有一个文件类型指针,今后对文件的访问,会转化为针对文件类型指针的操作。第8页/共41页12.2文件的打开与关闭12.2.1文件的打开──fopen()函数
1.用法:FILE*fopen(“文件名”,“操作方式”);
2.功能:返回一个指向指定文件的指针。
3.函数原型:stdio.h。
注:对文件操作的库函数,函数原型均在头文件stdio.h中。后续函数不再赘述。
对文件进行操作之前,必须先打开该文件;使用结束后,应立即关闭,以免数据丢失。C语言规定了标准输入输出函数库,用fopen()函数打开一个文件,用fclose()函数关闭一个文件。第9页/共41页(1)“文件名”是指要打开(或创建)的文件名。如果使用字符数组(或字符指针),则不使用双引号。(2)“操作方式”如表12-2所示。例如,FILE*fp;fp=fopen("data.99","r");3.说明(1)如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL(其值在头文件stdio.h中被定义为0)。为增强程序的可靠性,常用下面的方法打开一个文件:
if((fp=fopen("文件名","操作方式"))==NULL){printf("cannotopenthisfile\n");exit(0);}第10页/共41页●关于exit()函数1)用法:voidexit([程序状态值]);2)功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为0时,表示程序正常退出;非0值时,表示程序出错退出。(2)“r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。(3)使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。第11页/共41页使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。(4)有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。(5)在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:
1)标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。第12页/共41页2)标准输出文件——stdout:指向终端输出(一般为显示器)。3)标准错误文件——stderr:指向终端标准错误输出(一般为显示器)。12.2.2文件的关闭──fclose()函数1.用法:intfclose(FILE*文件指针);2.功能:关闭“文件指针”所指向的文件。如果正常关闭了文件,则函数返回值为0;否则,返回值为非0。例如,fclose(fp);/*关闭fp所指向的文件*/第13页/共41页12.3文件的读写文件打开之后,就可以对它进行读与写的操作了。下面按文件的性质分类进行操作。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写或按字符串读写;对二进制文件来说,可进行成块的读写或格式化的读写。12.3.1读/写一个字符
C提供fgetc和fputc函数对文本文件进行字符的读写。读字符函数fgetc
fgetc()函数的原型存于stdio.h头文件中,格式为:
intfgetc(FILE*fp);
第14页/共41页
功能:从指定的文件中读一个字符,并将文件的位置指针移到下一个字符处,如果已到文件尾,函数返回EOF。fgetc()函数调用形式为:字符变量=fgetc(文件指针);例如:
ch=fgetc(fp);/*从fp指向的文件中读取一个字符送入ch变量中*/
2.写字符函数fputc
fputc()函数的原型为:intfputc(intch,FILE*fp)
功能:将字符ch的值写入所指定文件的当前位置处,并将文件指针后移一位。fputc()函数的返回值是所写入字符的值,出错时返回EOF。第15页/共41页函数的调用形式:fputc(字符,文件指针);例如:
fputc(‘a’,fp);/*将字符常量a写入fp所指向的文件中*/
【例12-1】将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。(采用带参数的main(),指定的磁盘文件名由命令行方式通过键盘给定。)/*exam12_1*/#include"stdio.h"#include"stdlib.h"intmain(intargc,char*argv[]){charch;FILE*fp;inti;
(续)第16页/共41页if(argc<=1){printf(“toofewparameters.”);exit(0);}/*若忘记输入文件名则提示*/if((fp=fopen(argv[1],"r"))==NULL){/*打开一个由argv[1]所指的文件*/printf("notopen");exit(0);}while((ch=fgetc(fp))!=EOF)/*从文件读一字符,显示到屏幕*/putchar(ch);fclose(fp);return0;}
[演示]注意:在编译连接后在DOS命令方式下执行程序,并要在可执行文件名后输入目标文本文件的完整路径。第17页/共41页【例12-2】从键盘输入字符,存到磁盘文件test.txt中。/*exam12_2*/#include"stdio.h"#include"stdlib.h"intmain(void){FILE*fp;/*定义文件指针*/charch;if((fp=fopen("test.txt","w"))==NULL)/*以只写方式打开文件*/{printf("cannotopenfile!\n");exit(0);}
while((ch=fgetchar())!='\n')/*只要输入字符非回车符*/fputc(ch,fp);/*写入文件一个字符*/fclose(fp);return0;}[演示]第18页/共41页程序运行结果:Ilovechina!↙(运行后从键盘输入)为了验证从键盘输入的字符是否写入了文件,我们可以在DOS操作系统环境下,利用type命令显示test.txt文件的内容。假设当前路径是c:\tc,则输入以下命令:c:\tc>typetest.txt↙Ilovechina!(显示内容)说明从键盘写入的字符已存入文件test.txt中。注意:应转入当前路径后使用type命令,这里假设当前路径是c:\tc。可以执行“file”菜单的“OSShell”菜单项暂时转入DOS命令行方式。第19页/共41页2.3.2读/写一个字符串
C语言提供fgets()和fputs()函数来实现对文件以字符为单位进行读写,由于这两个函数在使用中往往是一次读写一行,所以也称行读写函数。1.读字符串函数fgets
C提供读字符串的函数原型在stdio.h头文件中,其函数形式为:char*fgets(char*str,intnum,FILE*fp)fgets()函数的调用形式为:fgets(字符数组名,n,文件指针);
功能:从文件指针所指向的文件中读取至多n-1个字符,在读入的最后一个字符后加上串结束标志’\0’,并把它们放入字符数组中。读取过程中如果遇到了换行符或EOF(文件结束符),则读取结束。第20页/共41页【例12-3】从test.txt文件中读入一个含10个字符的字符串。/*exam12_3*/#include"stdio.h"#include"stdlib.h"intmain(void){FILE*fp;/*定义文件指针*/charstr[11];if((fp=fopen("test.txt","r"))==NULL)/*以只读方式打开文件*/{printf("cannotopenfile!\n");exit(0);}fgets(str,11,fp);printf(“\n%s\n”,str);/*将字符串输出到屏幕*/fclose(fp);return0;}[演示]注意:编译时使用“changedir”命令修改工作目录为test.txt所在目录。第21页/共41页2.写字符串函数fputs
C提供写字符串的函数原型在stdio.h头文件中,其函数形式为:intfputs(char*str,FILE*fp)其调用的一般形式为:fputs(字符串,文件指针);功能:将字符串写入文件指针所指向的文件。操作成功时,函数返回0值,失败返回非零值。第22页/共41页【例12-4】写入多个字符串到磁盘文本文件test.txt。/*exam12_4*/#include"stdio.h"#include"stdlib.h"#include"string.h"intmain(void){FILE*fp;charstr[128];if((fp=fopen("test.txt","w"))==NULL)/*打开只写的文本文件*/{printf("cannotopenfile!");exit(0);}(续)可以写出test.txt的绝对路径,如:c:\examples\test.txt。第23页/共41页while((strlen(gets(str)))!=0){/*若串长度为零,则结束*/fputs(str,fp);/*写入串*/fputs("\n",fp);/*写入回车符*/}fclose(fp);/*关文件*/return0;}
Hello!↙Howdoyoudo↙Good-bye!↙↙c:\tc>typetest.txt↙Hello!HowdoyoudoGood-bye!运行后输入用type命令验证结果注意:应转入当前路径后使用type命令。[演示]第24页/共41页12.3.3读/写一个数据块──fread()和fwrite()实际应用中,常常要求1次读/写1个数据块。为此,ANSIC标准设置了fread()和fwrite()函数。
1.用法:intfread(void*buffer,intsize,intcount,FILE*fp);intfwrite(void*buffer,intsize,intcount,FILE*fp);2.功能:fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针向前移动size*count个字节。其中,buffer是存放读入数据的起始地址(即存放何处)。第25页/共41页fwrite()──从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中;同时,将读写位置指针向前移动size*count个字节。其中,buffer是要输出数据在内存中的起始地址(即从何处开始输出)。如果调用fread()或fwrite()成功,则函数返回值等于count。fread()和fwrite()函数,一般用于二进制文件的处理。第26页/共41页【例12-5】向磁盘写入格式化数据,再从该文件读出显示到屏幕。/*exam12_5*/#include"stdio.h"#include"stdlib.h"intmain(void){FILE*fp1;inti;structstu{/*定义结构体*/charname[15];charnum[6];floatscore[2];}student;if((fp1=fopen("test.txt","wb"))==NULL){/*以二进制只写方式打开文件*/printf("cannotopenfile");exit(0);}(续)第27页/共41页printf("inputdata:\n");for(i=0;i<2;i++){scanf("%s%s%f%f",,student.num,&student.score[0],&student.score[1]);/*输入一记录*/fwrite(&student,sizeof(student),1,fp1);/*成块写入文件*/}fclose(fp1);if((fp1=fopen("test.txt","rb"))==NULL){/*重新以二进制只读打开文件*/printf("cannotopenfile");exit(0);}(续)第28页/共41页printf("outputfromfile:\n");for(i=0;i<2;i++){fread(&student,sizeof(student),1,fp1);/*从文件成块读*/printf("%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*显示到屏幕*/}fclose(fp1);return0;}inputdata:xiaowanj00187.598.4↙xiaolij00299.589.6↙outputfromfile:xiaowanj00187.5098.40xiaolij00299.5089.60运行情况:[演示]第29页/共41页12.3.4对文件进行格式化读/写
前面的程序设计中,我们介绍过利用scanf()和printf()函数从键盘格式化输入及在显示器上进行格式化输出。对文件的格式化读写就是在上述函数的前面加一个字母f成为fscanf()和fprintf()。其函数原型为:intfscanf(FILE*stream,char*format,arg_list)intfprintf(FILE*stream,char*format,arg_list)这两个函数的一般调用形式为:fscanf(文件指针,格式控制串,输入地址表列);fprintf(文件指针,格式控制串,输出表列);在使用上与标准的输入输出函数相同,只是fscanf()和fprintf()的输入输出是对文件进行。其实scanf()和printf()从广义上讲也是对文件进行,操作对象是对标准输入(stdin)输出(stdout)文件。第30页/共41页【例12-6】将一些格式化的数据写入文本文件,再从该文件中以格式化方法读出显示到屏幕上,其格式化数据是两个学生记录,包括姓名、学号、两科成绩。/*exam12_6*/#include"stdio.h"#include"stdlib.h"intmain(void){FILE*fp;inti;structstu{/*定义结构体类型*/charname[15];charnum[6];floatscore[2];}student;/*说明结构体变量*/(续)第31页/共41页if((fp=fopen("test.txt","w"))==NULL){/*以文本只写方式打开文件*/printf("cannotopenfile");exit(0);}printf("inputdata:\n");for(i=0;i<2;i++){scanf("%s%s%f%f",,student.num,&student.score[0],&student.score[1]);/*从键盘输入*/fprintf(fp,"%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*写入文件*/}(续)第32页/共41页fclose(fp);/*关闭文件*/if((fp=fopen("test.txt","r"))==NULL){/*以文本只读方式重新打开文件*/printf("cannotopenfile");exit(0);}printf("outputfromfile:\n");while(fscanf(fp,"%s%s%f%f\n",,student.num,&student.score[0],student.score[1])!=EOF)/*从文件读入*/printf("%s%s%7.2f%7.2f\n",,student.num,student.score[0],student.score[1]);/*显示到屏幕*/fclose(fp);/*关闭文件*/return0;}[演示]第33页/共41页12.3.5读/写函数的选用原则从功能角度来说,fread()和fwrite()函数可以完成文件的任何数据读/写操作。但为方便起见,依下列原则选用:
1.读/写1个字符(或字节)数据时:选用fgetc()和fputc()函数。
2.读/写1个字符串时:选用fgets()和fputs()函数。
3.读/写1个(或多个)不含格式的数据时:选用fread()和fwrite()函数。
4.读/写1个(或多个)含格式的数据时:选用fscanf()和fprintf()函数。第34页/共41页12.4文件定位文件中有一个读写位置指针,指向当前的读写位置。每次读写1个(或1组)数据后,系统自动将位置指针移动到下一个读写位置上。
如果想改变系统这种读写规律,可使用有关文件定位的函数。
12.4.1位置指针复位函数rewind()1.用法:intrewind(文件指针);2.功能:使文件的位置指针返回到文件头。
12.4.2随机读写与fseek()函数对于流式文件,既可以顺序读写,也可随机读写,关键在于控制文件的位置指针。
所谓顺序读写是指,读写完当前数据后,系统自动将文件的位置指针移动到下一个读写位置上。第35页/共41页所谓随机读写是指,读写完当前数据后,可通过调用fseek()函数,将位置指针移动到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 结构性心脏病介入治疗规范化诊疗业务学习
- 《中小学学生学籍管理办法(2026年)》
- 外墙涂料施工工艺及质量控制指南
- 农林牧渔企业信息公开工作规范落实自查自纠整改复查报告
- 2025年东昌府区柳园街道招聘社区网格员考试试题附答案详解
- 某人防工程监理实施细则
- 乡村兽医培训考试试题
- 法制宣传日宣传活动总结
- 公司文职人员试用期转正工作总结
- 活动宣传方案
- 2026贵州省住房资金管理中心招聘工作人员1人备考题库含答案详解(考试直接用)
- 2026储能入市背景下的投资测算工具设计逻辑深度研究报告
- 2026四川省阿坝州州级事业单位考试调动37人重点基础提升(共500题)附带答案详解
- 2026湖北神农架林区公安局招聘辅警22人笔试参考题库及答案解析
- 2026学校规范教育收费自查整改报告
- 2026中华全国供销合作总社直属事业单位招聘27人考试参考题库及答案解析
- 事故隐患排查治理基本知识
- 煤矿防治水知识培训
- 科学学习方法小学主题班会课件
- 2026江铜铜箔科技股份有限公司第一批次春季校园招聘89人建设笔试参考题库及答案解析
- 2026年建安杯信息通信建设行业安全竞赛重点题库(新版)
评论
0/150
提交评论