版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1C程序设计文件的输入输出2二进制文件把数据按其在内存中的形式存储在文件中,信息在文件中的表示形式与在计算机内存中的表示形式完全一样,文件中的数据信息可以被分成一个个字节,但通常是由若干字节构成一个有意义的数据信息。例如,由4个字节信息构成一个整数。
正文文件与二进制文件的区别1.存储数值型数据的形式不同。例如:整数10000在内存中用4个字节表示,保存到正文文件中要占5个字节;保存到二进制文件中只占4个字节。2.正文文件的数据是字符,便于阅读。但二进制文件中的信息难以理解。文件类型第1页/共35页3缓冲区操作系统为能高效地管理和控制设备,给程序正在使用的每个文件在内存中开辟一个适当大小的缓冲区。
程序要从文件读入一些信息时,系统先一次性地读入足够多的信息存于缓冲区中,供程序一部分一部分地使用。程序要写信息到文件时,也先把信息写到缓冲区中,待缓冲区写满或写文件结束时,才把缓冲区中的内容写到文件中。程序要读写文件中的数据,首先打开要读写的文件(写文件时可能要新建文件),然后才能对该文件读写数据,并在使用结束时关闭文件。程序与文件交换数据的实现过程第2页/共35页4文件类型
FILE
用于存放有关对文件进行操作所需的控制信息结构,如文件名、文件读写状态、文件缓冲区大小和位置、当前读写位置等。文件类型由系统预定义。文件类型指针变量
FILE*fp;
程序在使用文件前,先调用打开函数。打开函数为文件指定一个FILE类型的结构,并返回该结构的指针。系统通过指向该结构的指针才能正确读写文件。有了文件指针变量,使得C程序能找到与它对应的文件。在程序中若要访问n个文件,一般应设n个文件指针变量。文件类型指针变量第3页/共35页51.文件打开函数
fopen()形式:fopen(文件名,使用方式)功能:分配一个存放文件控制信息的结构,并返回这个结构的指针。其中:文件名(包括目录路径)为字符串表达式。函数返回值:如果打开成功,函数返回文件指针;打开不成功,返回NULL。例如:fp=fopen("\\usr4\\smp.dat","w");表示:以写方式打开根目录下的usr4子目录中的smp.dat文件。第1个\为转义字符8.2常用的数据文件库函数第4页/共35页6
可能会因某种原因不能打开文件。例如,读文件方式打开一个不存在的文件;在写文件方式下,外部存储介质无剩余的自由空间,或外设故障;或超过系统能同时打开的文件数等。
文件不能打开时,函数fopen()将返回空指针值NULL。程序应考虑到文件不能正常打开的极端情况,应用以下形式的代码描述打开一个文件的要求:
if((fp=fopen(fname,"r"))==NULL){printf("不能打开文件%s。\n",fname);return;}
1.
文件打开函数
fopen()第5页/共35页7文件使用方式 意义
"r"
只读,为读打开正文文件
"w"
只写,为写打开正文文件
"a"
追加,从正文文件尾开始写
"rb"
只读,为读打开二进制文件
"wb"
只写,为写打开二进制文件
"ab"
追加,从二进制文件尾开始写
"r+"
读写,为读/写打开正文文件
"w+"
读写,为读/写建立并打开新的正文文件
"a+"
读写,为读/写打开正文文件 表8-1文件使用方式第6页/共35页8形式:fclose(fp)功能:使文件指针变量fp终止原先调用函数fopen()时所建立的与文件的联系。函数返回值:如果关闭成功,函数返回0;如果检测到错误,返回EOF(在stdio.h文件中定义为–1)。例如:fclose(fp);说明:
1.文件被关闭后,不能再通过该文件指针变量对其原先相连的文件进行读写操作,除非被再次打开。
2.文件被关闭后,原文件指针变量又可用来打开其他文件,与其他文件建立新的相联系。2.文件关闭函数fclose()第7页/共35页9形式:fgetc(fp)功能:从文件指针fp指向的文件读入一个字符(类似于getchar函数)。函数返回值:读入成功,返回读入的字符;读入时遇到文件结束,则返回文件结束标记EOF。例如:ch=fgetc(fp);表示:从fp所指文件读入一个字符存于变量ch。3.从文件读一个字符函数fgetc()第8页/共35页10形式:fputc(ch,fp)功能:将ch中的字符输出到文件指针fp指向的文件中(类似于putchar函数)。函数返回值:输出成功,返回输出的字符;输出失败则返回EOF。例如:fputc('A',fp);表示:将大写字母A写到fp指向的文件中。4.写一个字符到文件函数fputc()第9页/共35页11【例1】从键盘上输入字符,依次送入指定的文件,直到输入一个"#"为止。
#include<stdio.h>voidmain(){FILE*fp;charch,fname[40];printf("输入文件名:");scanf("%s",fname);
fp=fopen(fname,"w");fflush(stdin);/*清输入缓冲区*/printf("开始输入字符串:\n");ch=getchar();while(ch!='#'){fputc(ch,fp);ch=getchar();}fclose(fp);/*关闭文件*/}fputc()和fgetc()函数-例1设运行情况如下:输入文件名:d:\file1.txt开始输入字符串:FudanUniversity.Shanghai,China.#第10页/共35页12【例2】将一个文件中的数据复制到另一个文件中。
#include<stdio.h>voidmain(){FILE*in,*out;charch,infile[40],outfile[40];printf("输入源文件名:");gets(infile);/*或scanf("%s%*c",infile);*/if((in=fopen(infile,"r"))==NULL){printf("不能打开源文件
%s\n",infile);scanf("%*c");/*起暂停作用*/return;}fputc()和fgetc()函数-例2第11页/共35页13printf("输入目标文件名:");gets(outfile);out=fopen(outfile,"w");while((ch=fgetc(in))!=EOF)fputc(ch,out);fclose(in);fclose(out);}fputc()和fgetc()函数-例2设运行情况如下:输入源文件名:d:\file1.txt输入目标文件名:d:\file2.txt第12页/共35页14形式:fprintf(文件指针,格式字符串,输出项表)
功能:作用类似于printf函数。函数返回值:输出成功,返回实际输出的字符数;输出失败则返回EOF。例如:fprintf(wp,"i=%dr=%6.4f\n",i,r);表示:将整型变量i和实型变量r的值按格式输出到wp指向的文件中。5.格式输出函数fprintf()
第13页/共35页15形式:fscanf(文件指针,格式字符串,输入项地址表)
功能:作用类似于scanf函数。函数返回值:读取成功,返回实际读入数据的个数;读入失败则返回EOF。例如:fscanf(rp,"%d%f",&i,&r);表示:从rp指向的文件上为整型变量i和浮点型变量r读入数据。6.格式输入函数fscanf()
第14页/共35页16形式:fgets(str,n,fp)功能:从指定的文件读取n-1个字符,并存入字符数组str中(类似gets函数)。函数返回值:读取成功,返回str的首地址;读入失败则返回NULL地址。说明:1.当连续读入n-1个字符,或遇到换行符,或遇到文件结束时,读字符过程结束。
2.字符串读入后,在最后自动加一个'\0'。例如:chara[80];FILE*in;while(!feof(in))printf("%s",fgets(a,80,in));表示:将文件内容一行一行地输出。7.从文件读字符串函数fgets()第15页/共35页17形式:fputs(str,fp)功能:将字符串输出到fp指向的文件(类似puts函数)。其中:str可以是字符串常量、字符数组或字符指针。函数返回值:输出成功,返回最后输出的字符;输出失败,返回EOF。例如:fputs("China",fp);表示:将字符串"China"输出到fp指向的文件。8.
写字符串到文件函数fputs()第16页/共35页18形式:rewind(fp)功能:将fp指向的文件中的当前读写位置回到文件之首。函数返回值:无。9.
回到文件头函数rewind()第17页/共35页19形式:fseek(fp,offset,ptname)功能:将文件的当前位置任意移动,实现随机读写。其中:ptname为文件读写的起始位置,只允许0、1或2。0表示文件首(或用SEEK_SET表示);1表示当前位置(或用SEEK_CUR表示);2表示文件尾(或用SEEK_END表示)。
offset为long型的位移量,以ptname为基准,移动的字节数。函数返回值:成功移动返回0,否则返回非0。10.
文件当前位置移动函数fseek()第18页/共35页20【例1】fseek(fp,40L,SEEK_SET);
表示:将当前位置移到离文件头40个字节处。【例2】fseek(fp,20L,SEEK_CUR);
表示:将当前位置移到离当前位置20个字节处。【例3】fseek(fp,-30L,SEEK_END);
表示:将当前位置移到文件尾后退30个字节处。
说明:fseek一般用于二进制文件的随机读写。10.
函数fseek-例第19页/共35页21形式:ftell(fp)功能:得到fp指向文件当前位置相对于文件首的偏移字节数。函数返回值:文件首到文件当前读写位置的距离(字节数)。例如:fseek(fp,0L,SEEK_END);
/*当前位置移到文件尾*/ len=ftell(fp);
/*求文件的长度*/11.
文件头到当前位置距离函数ftell()第20页/共35页22形式:fread(buffer,size,count,fp)功能:从fp指向的文件读入count*size个字节,存入buffer。函数返回值:读取成功返回count值,否则返回0。说明:常用于二进制文件的读。其中:buffer:字符数组名或指针
size:读写数据块的字节数
count:读写数据块的个数
fp:文件指针12.成批读数据函数fread()第21页/共35页23形式:fwrite(buffer,size,count,fp)功能:从buffer中取出数据,向fp指向的文件写count*size个字节。函数返回值:写文件成功返回count值,否则<count。说明:常用于二进制文件的写。其中:buffer:字符数组名或指针
size:读写数据块的字节数
count:读写数据块的个数
fp:文件指针13.
文件头到当前位置距离函数fwrite()第22页/共35页24
一个完整的文件处理程序,必须包含下列内容:(1)在程序的开始处定义文件指针变量,和存储文件名的字符数组。例如:#include<stdio.h> FILE*fp; /*定义文件指针变量fp*/ charfname[40]; /*存储文件目录路径*/(2)用类似下面的代码输入文件名。
printf("请输入文件名(包括文件的目录路径、文件的扩展名)\n"); scanf("%s%*c",fname);/*输入文件名及其随后的回车符*/说明:可以使用gets(fname);来代替scanf。8.3文件处理程序结构第23页/共35页258.3文件处理程序结构(3)使用文件前,按使用要求先打开文件。例如:if((fp=fopen(fname,"r"))==NULL){
/*以读文件方式打开*/printf(”%s文件不能打开,结束程序的执行\n”,fname);return;}说明:1.
如果要向文件写数据,应使用写文件打开:
fp=fopen(fname,"w");/*以写文件方式打开*/ 2.读打开时,要求被打开文件已存在。写打开时,如果被打开文件不存在,则建立一个以fname内容命名的新文件;如果被打开文件已存在,则该文件上的数据被清除。第24页/共35页268.3文件处理程序结构(4)文件使用结束后,要及时关闭。例如:fclose(fp);/*以后fp又可用于打开文件*/(5)调用库函数对数据文件进行输入输出。见8.2介绍的文件库函数。第25页/共35页27#include<stdio.h>FILE*fp;voidmain(){intx,k;charfname[40];printf("输入文件名:");scanf("%s%*c",fname);fp=fopen(fname,"w");k=1;while(scanf("%d",&x)==1){/*能正确输入整数循环*/fprintf(fp,"%d\t",x);if(k++%5==0)fprintf(fp,"\n");}fclose(fp);printf("\n共输出了%d个整数到文件%s.\n",k-1,fname);}【例8.1】从键盘输入整数序列,
并按输入顺序输出到指定文件输入文件名:d:\file1.txt12345678a共输出了8个整数到文件d:\file1.txt第26页/共35页28#include<stdio.h>FILE*fp;intmain(){intx,k;charfname[40];printf("输入文件名:");scanf("%s%*c",fname);if((fp=fopen(fname,"r"))==NULL){/*以输入方式打开正文文件*/printf("不能打开文件%s。\n",fname);return0;}【例8.2】从指定的文件输入整数,
并按输入顺序输出到显示屏上第27页/共35页29k=1;while(fscanf(fp,"%d",&x)==1){printf("%d\t",x);if(k++%5==0)printf("\n");}fclose(fp);printf("\n从文件%s输入了%d个整数.\n",fname,k-1);return1;}【例8.2】从指定的文件输入整数,
并按输入顺序输出到显示屏上输入文件名:d:\file1.txt12345678从文件d:\file1.txt输入了8个整数.第28页/共35页30#include<stdio.h>FILE*fp;voidmain(){intch;charfname[40];printf("输入文件名:");scanf("%s%*c",fname);fp=fopen(fname,"w");
【例8.3】逐行复制从键盘输入字符到指定文件,
直至输入空行结束第29页/共35页31while((ch=getchar())!='\n'){/*逐行处理,至空行结束*/dofputc(ch,fp);/*行内字符逐一复制*/while((ch=getchar())!='\n');/*处理当前行*/fputc(ch,fp);/*输出换行符*/}fclose(fp);printf("程序复制键盘输入字符结束。\n");}【例8.3】逐行复制从键盘输入字符到指定文件,
直至输入空行结束输入文件名:d:\file1.txtFudanUniversity.Shanghai,China.程序复制键盘输入字符结束。第30页/共35页32【例8.4】输入一篇英文短文,统计文件中的行数、单词数和字符数的程序。设全由英文字母组成的一段连续字符序列为一个英文单词。程序为统计单词数,需要标识一个单词的开始和结束,程序引入一个状态变量。如果程序遇到一个非英文字母字符,程序设置状态不在单词中;如果程序遇到一个英文字母字符,程序的原先状态又不在单词中,表示程序遇到一个新的单词,程序将单词计数器增1,并置状态在单词中。8.4文件处理程序实例-解题思路第31页/共35页33#include<stdio.h>#include<ctype.h>#defineINWORD1 /*正在单词中*/#defi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 暨南大学《成本会计》2021-2022学年第一学期期末试卷
- 济宁学院《高等数学2》2021-2022学年第一学期期末试卷
- 二零二四年度企业改制与资产重组顾问合同
- 二手书籍买卖合同2024年度样本及所有权转移2篇
- 一次性研发合作合同范本(2024版)2篇
- 药店培训皮肤病
- 西师版五年级上数学教案
- 班主任校本培训
- 二零二四年物联网技术研发与产品应用协议3篇
- 腰椎椎管减压术术后护理
- 高温超导材料PPT
- (中职) Animate动画设计与制作项目教程项目六 商业案例ppt教学课课件
- 物理培优工作计划7篇
- 家庭婚姻法律精品课件
- 《新生儿黄疸》课件
- 3.2 体量与力量-雕塑的美感 课件-高中美术人美版(2019)美术鉴赏
- 六年级下册美术教案-第6课 综合版画(用各种材料来制版) ▏人美版(北京)
- GB∕T 12234-2019 石油、天然气工业用螺柱连接阀盖的钢制闸阀
- 《现代秘书心理学》教案
- 接待审批单(标准模版)
- DB37T 5173-2021 绿色农房建设技术标准
评论
0/150
提交评论