C程序设计课件第7章_第1页
C程序设计课件第7章_第2页
C程序设计课件第7章_第3页
C程序设计课件第7章_第4页
C程序设计课件第7章_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重点:文件打开、关闭、读写、定位等系统函数的运用难点:文件读写函数的运用掌握文件的基本概念掌握文件的打开及关闭函数的运用掌握文件字符读写函数的运用掌握文件字符串读写函数的运用掌握文件块读写函数的运用掌握文件格式读写函数的运用掌握文件读写位置定位方法教学目标重点难点文件系统概述与文件类型文本文件(ASCII文件):二进制文件:2字节0001011000101110000101100010111000110101001101100011011100111000内存中存储形式ASCII码形式(4字节)二进制形式(2字节)56781.文件操作系统以文件为单位对数据进行管理,对文件实行按名存取

例:shortinta=5678;

5678在内存中的存储形式,按ASCII码及二进制存储到文件中的形式为:

文件是存储在外部介质上的数据的集合2.文件分类

每一个字节存放一个字符数据按其在内存中的存储形式存放3.文件处理系统程序数据区文件缓冲区文件输出输入写入读出②非缓冲区文件系统缓冲区的大小和位置由程序员根据程序需要自行设定。系统自动在内存为每一个正在使用的文件开辟一个缓冲区。①缓冲区文件系统

用户使用文件时,先将文件调入内存,并通过一个结构体类型的指针与文件建立联系,从而对文件进行操作控制,这个结构体类型的指针称为文件类型指针。4.文件类型指针文件类型指针定义的一般形式

FILE*变量名;文件类型指针如:FILE*fp1,*fp2;含义:定义了两个文件类型的指针变量,可以打开两个文件。文件的打开与关闭3.文件打开函数(fopen())1.打开文件将文件指针与文件脱离,并将文件从内存写入外存。将文件调入内存,并与文件指针建立联系。2.关闭文件函数调用格式

fp=fopen(文件名,"打开方式")返回值:成功,返回文件结构体信息在缓冲区中的起始地址;

失败,返回空指针(NULL)。功能:按使用方式打开指定文件,并与文件指针建立联系。例:FILE*fp;fp=fopen("file1.dat","r");函数参数打开方式含义打开方式含义r(只读文本)为读打开一个文本文件r+(读写文本)为读/写打开一个文本文件w(只写文本)为写打开一个文本文件w+(读写文本)为读/写建立一个新的文本文件a(追加文本)向文本文件尾部追加数据a+(读写文本)为读/写打开一个文本文件rb(只读二进制)为读打开一个二进制文件rb+(读写二进制)为读/写打开一个二进制文件wb(只写二进制)为写打开一个二进制文件wb+(读写二进制)为读/写建立一个新的二进制文件ab(追加二进制)向二进制文件尾部追加数据ab+(读写二进制)为读/写打开一个二进制文件(2)文件打开方式例:打开一个已存在的非空文件file1.dat。①

fp=fopen("file1.dat","r");②charname[10]="file1.dat";fp=fopen(name,"r");③charname[10]="file1.dat",*p=name;fp=fopen(p,"r");(1)文件名打开的文件,可用字符串常量、字符数组名、字符指针变量表示。文件名中可以包含文件所在的盘符和路径

①r表示只读(readonly)w表示只写

(writeonly)a表示追加(append)b表示二进制(binary)+表示可读可写说明②用r方式打开的文件必须存在。用w方式打开的文件无论是否存在,都重新建立,若存在,

则先删除再新建。用a方式打开文件时,如果文件不存在,则建立;否则,文件中的位置指针移到文件末尾,准备追加数据。③如果不能实现打开操作,程序中应做处理,返回一个出错信息,常用如下方式打开文件并测试返回值。

if((fp=fopen(文件名,"打开方式"

))==NULL){printf("Cannotopenthisfile!\n");exit(0);}④写入文本文件时,系统自动将回车换行符转换为一个换行符读出文本文件时,又将换行符转换成回车和换行两个字符。⑤程序开始运行时,系统自动打开三个标准文件:标准输入文件(键盘)(stdin指向)

标准输出文件(显示器或打印机)(stdout指向)

标准出错处理文件(stderr指向)stdin、stdout和stderr是C系统定义的文件指针常量4.文件关闭函数(fclose())EOF是文本文件结束标志,其值为-1,在stdio.h中定义函数调用格式

fclose(fp)/*fp是文件指针*/返回值成功,返回0;失败,返回EOF(-1)。功能关闭fp所指向的文件。即将文件指针与文件“脱钩”,同时将内存文件写入外存。文件的读写操作A调用格式

fgetc(fp)/*fp是文件指针*/返回值:成功,返回读出字符;失败,返回EOF(-1)。1.读写一个字符函数功能从fp所指向文件中读出一个字符。在stdio.h中有宏定义:#definegetc(fp)fgetc(fp)在stdio.h中有宏定义:#definegetchar()fgetc(stdin)……A位置指针说明①读字符函数(fgetc())fgetc(fp)getc(fp)getchar()fgetc(stdin)#include"stdlib.h"#include"stdio.h"voidmain(){FILE*fp;charch,filename[10];printf("Inputfilename:");scanf("%s",filename);if((fp=fopen(filename,"r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}while()putchar(ch);fclose(fp);}【例】从文本文件中顺序将字符读出并在屏幕显示。调用格式:feof(fp)功能:测试二进制文件或文本文件是否结束。返回值:结束,返回1;否则,返回0。(ch=fgetc(fp))!=EOF!feof(fp)程序1☞/*输入文件名*//*打开文件*//*从文件读字符并显示*//*关闭文件*/②测试文件结束函数(feof(fp))putchar(fgetc(fp));

③写字符函数(fputc())功能把ch的值写入fp所指向的文件。返回值:成功,返回写入字符;失败,返回EOF(-1)。

在stdio.h中有宏定义:

#defineputc(ch,fp)fputc(ch,fp)

在stdio.h中有宏定义:

#defineputchar(ch)fputc(ch,stdout)调用格式

fputc(ch,fp)/*fp是文件指针*/AA位置指针ch说明fputc(ch,fp)putc(ch,fp)putchar(ch)fputc(ch,stdout)【例】将从键盘输入的一组字符(“#”结束)写入到磁盘文件。#include"stdio.h"#include"stdlib.h"voidmain(){FILE*fp;charch,filename[10];printf("Inputfilename:");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("Cannotcreatethisfile!\n");exit(0);}printf("Pleaseinputtext(#==End):\n");while((ch=getchar())!='#')fputc(ch,fp);fclose(fp);}程序2☞/*输入文件名*//*打开文件*//*从键盘读字符并写入文件*//*关闭文件*/2.读写一个字符串函数①str是地址表达式(一般为字符数组名或字符型指针变量名)③从文件中读出字符串后,自动在字符串的尾部加'\0'②若在读完n-1个字符之前遇到换行符或EOF,读入操作结束位置指针n-1个字符str\0①读字符串函数(fgets())调用格式

fgets(str,n,fp)/*fp是文件指针*/返回值:成功,返回str的值;失败,返回空指针(NULL)。功能

从fp指向文件中读出n-1个字符,存储到str开始的内存单元。说明②写字符串函数(fputs())①str可以地址表达式,也可以是字符串常量②

写入时,遇'\0'自动结束操作,'\0'不写入位置指针str\0调用格式

fputs(str,fp)/*fp是文件指针*/功能将从str开始的字符串写入到fp所指向的文件。返回值:成功,返回0;失败,返回EOF(-1)。说明【例】先将键盘输入的4行字符串写入到磁盘文件,再将写入文件的字符串输出到屏幕上。#defineN4#include"stdio.h"#include"stdlib.h"voidmain(){FILE*fp;charch[81],filename[12];inti;printf("Inputfilename:");gets(filename);if((fp=fopen(filename,"w"))==NULL){printf("Cannotcreatethisfile!\n");exit(0);}printf("Input%dlinestrings:\n",N);for(i=1;i<=N;i++){gets(ch);fputs(ch,fp);fputc('\n',fp);/*写入回车换行*/}fclose(fp);if((fp=fopen(filename,"r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}printf("Fromfile:%s\n",filename);for(i=1;i<=N;i++){fgets(ch,81,fp);/*将字符串从文件中读出存储到内存中*/printf("%s",ch);/*将内存中的字符串输出到屏幕上*/}fclose(fp);}程序3☞/*输入文件名*//*按写方式打开文件*//*从键盘读取字符串并写入文件*//*关闭文件*//*按读方式打开文件*//*从文件读取字符串并在屏幕显示*//*关闭文件*/3.读写一个数据字块函数①读数据字块函数(fread())调用格式

fread(buffer,size,count,fp)/*fp是文件指针*/功能从fp所指向文件中读出count*size字节数据,存放到buffer开始的内存单元。返回值:成功,返回count值;失败,返回非count值。例:floatf[2];fread(f,4,2,fp);从fp所指文件中读出2个4个字节的数据,存储到数组f(f[0]、f[1])。位置指针count*size个字节buffer用fread()和fwrite()时,文件一般应以二进制方式打开,目的是输入输出都不发生字符转换,从而保证原样读写。②写数据字块函数(fwrite())调用格式

fwrite(buffer,size,count,fp)

/*fp是文件指针*/功能将从buffer开始的count*size字节的数据写入fp所指向的文件。返回值:成功,返回count值;失败,返回非count值。例:shortinta[10]={1,2,3,4,5,6,7,8,9,10};fwrite(a,2,10,fp);

将数组a中的10个2个字节的数据写到fp所指向的文件。位置指针buffercount*size个字节#include"stdio.h"#include"stdlib.h"voidmain(){inta[5]={10,20,30,40,50},b[5],i;floatf=3.14159,ff;FILE*fp;if((fp=fopen("TEXT.txt","wb"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fwrite(&f,sizeof(float),1,fp);/*写实数*/fwrite(a,sizeof(int),5,fp);/*写5个整数*/fclose(fp);if((fp=fopen("TEXT","rb"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fread(&ff,sizeof(float),1,fp);/*读实数*/fread(b,sizeof(a),1,fp);/*读5个整数*/printf("ff=%f\nb=\t",ff);for(i=0;i<5;i++)printf("%d\t",b[i]);fclose(fp);}程序4☞【例】将一个实数和5个整数写入文件TEXT.txt,然后读出显示。/*按只写二进制方式打开文件*//*向文件写数据*//*关闭文件*//*按只读二进制方式打开文件*//*从文件读数据*//*将数据输出到屏幕*//*关闭文件*/调用格式

fscanf(fp,"格式控制字符串",地址表列)/*fp是文件指针*/4.格式化读写函数①格式化读入函数(fscanf())①"格式控制字符串"的格式一定要与文件中数据存放格式相一致②fscanf(stdin,"格式控制字符串",地址表列)

scanf("格式控制字符串",地址表列)功能按格式要求从fp指向文件中读出数据到指定的内存单元。例:inta,b;fscanf(fp,"%d%d",&a,&b);

从fp所指向文件读出两个整数分别赋值给变量a和b。返回值:成功,返回1;失败,返回-1。3434位置指针ab说明调用格式

fprintf(fp,"格式控制字符串",输出表列);

/*fp是文件指针*/②格式化输出函数(fprintf())fprintf(stdout,"格式控制字符串",输出表列);printf("格式控制字符串",输出表列);功能

将输出表列中的数据按指定格式写入fp所指向的文件。例:inta=3,b=4;fprintf(fp,"%d%d",a,b);

将变量a和b的值按指定格式写入到fp所指向的文件。返回值:成功则返回输出的字节数,错误则返回EOF(-1)。3434位置指针ab说明文件定位与随机读写调用格式

rewind(fp)功能

将fp所指向文件的位置指针重新返回到文件的开头。#include"stdio.h"voidmain(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");while(!feof(fp1))putchar(fgetc(fp1));/*显示*/

rewind(fp1);/*位置指针复位*/while(!feof(fp1))fputc(fgetc(fp1),fp2);/*复制*/fclose(fp1);fclose(fp2);}程序5☞位置指针1.位置指针复位函数(rewind())【例】有一个磁盘文件,先把它的内容显示到屏幕上,再把它复制到另一个文件。2.位置指针随机定位函数(fseek())起始点常量名标识数字表示文件开始SEEK_SET0文件当前位置SEEK_CUR1文件末尾SEEK_END2①起始点文件位置描述符调用格式

fseek(fp,位移量,起始点)功能在fp所指向的文件中,以起始点为基点,将位置指针向前或向后移动“位移量”个字节的距离。返回值:正确,返回0;错误,返回非0值。说明②

位移量(移动的字节数,一般为long型)fseek(fp,100L,0);fseek(fp,-40L,1);fseek(fp,-50L,SEEK_END);位置指针100个字节位置指针40个字节位置指针50个字节【例】在磁盘文件student.dat中有10个学生记录,将第1、3、5、

7、9号记录取出并显示到屏幕。

#include"stdlib.h"#include"stdio.h"structstudent{charname[10];intnum;intage;charsex;}stud[10];voidmain(){

inti;FILE*fp;

if(

(fp=fopen("student.dat","rb"))==NULL

){

printf("cannotopenfile\n");

exit(0);

}for(i=0;i<10;i+=2)

{

}fclose(fp);

}程序6☞fseek(fp,

i*sizeof(structstudent),

0);fread(&stud[i],sizeof(structstudent),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);/*打开文件*//*从文件读记录并显示*//*关闭文件*/调用格式

ftell(fp)功能:检测当前位置指针距离文件头的字节数。返回值:成功返回实际位移量(长整型);失败返回-1L。例:测试一个文件所占的字节数

fseek(fp,0L,2);/*将位置指针移到文件末尾*/volume=ftell(fp);/*文件尾到文件头的字节数*/位置指针字节数3.检测当前位置指针位置函数(ftell())

例:i=ftell(fp);/*位置指针距离文件头的字节数*/4.错误处理函数①文件操作出错测试函数(ferror())②清除错误标志函数(clearerr())调用格式

ferror(fp)功能:测试文件操作的一些函数是否出错。返回值:出错,返回非0值;未出错,返回0。调用格式

clearerr(fp)功能:将文件出错标志置为0。返回值:无分类函数功能

文件打开/关闭fopen()打开文件fclose()关闭文件

文件读写fgetc()从指定文件读取一个字符fputc()把字符输出到指定文件fgets()从指定文件读取字符串fputs()把字符串输出到指定文件fread()从指定文件中读取数据字块fwrite()把数据字块输出到指定文件fscanf()从指定文件按格式输入数据fprintf()按指定格式将数据输出到指定文件文件位置指针定位rewind()使文件位置指针重新至于文件开头fseek()改变文件位置指针的位置ftell()返回文件位置指针的当前值文件操作函数程序设计举例#include"stdio.h"voidmain(){FILE*fp;inti,m,s=0;fp=fopen("sushu.txt","w+");for(m=2;m<=100;m++){for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)fprintf(fp,"%4d",m);}rewind(fp);while(fscanf(fp,"%d",&m)!=-1)s+=m;printf("s=%d\n",s);fclose(fp);}程序7☞【例1】将100以内的所有素数写入文件sushu.txt,然后计算文件中的所有素数之和。/*打开文件*//*找素数并写入文件*//*位置指针定位到文件首*//*从文件读取数据并求和*//*输出素数和*//*关闭文件*/#include"stdio.h"#include"stdlib.h"voidmain(){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);}【例2】将一个磁盘文件中的信息复制到另一个磁盘文件。程序8☞/*输入原文件名*//*输入新文件名*//*打开原文件*//*打开新文件*//*复制*//*关闭文件*/【例3】将一个文本文件每一行内容逆置后存入原文件。程序9☞#include"stdio.h"#include"stdlib.h"voidrevert(char*s)/*字符串逆置*/{inti,j;chart;for(j=0;s[j]!='\0';j++);j--;i=0;while(i<j){t=s[i];s[i]=s[j];s[j]=t;i++;j--;}}main(){FILE*fp;charstr[81],filename[15];intn;printf("Inputafile’sname:");gets(filename);/*输入文件名*/if((fp=fopen(filename,"r+"))==NULL)/*打开文件*/{printf("Can'topenthisfile!\n");exit(0);}n=ftell(fp);/*记录位置指针位置,以便于回写*/while(fgets(str,81,fp)!=NULL)/*读取字符串*/{}fclose(fp);/*关闭文件*/}revert(str);/*逆置*/fseek(fp,n,SEEK_SET);/*定位,相对于文件头移动的距离*/fputs(str,fp);/*回写*/fseek(fp,0,SEEK_CUR);/*改变读写方式,准备读*/n=ftell(fp);/*记录位置指针位置,以便于回写*/练习题2.标准库函数fputs(p1,p2)的功能是()。

①从p1指向的文件中读取一个字符串存入p2开始的内存

②从p2指向的文件中读取一个字符串存入p1开始的内存

③从p2开始的内存中读取一个字符串存入p1指向的文件

④从p1开始的内存中读取一个字符串存入p2指向的文件1.以"w+"方式打开一个文件,下列描述中正确的是()。

①文件打开时,原有文件内容不被删除,位置指针移动至文件末尾,

可进行写和读操作

②文件打开时,原有文件内容被删除,可进行写和读操作

③文件打开时,原有文件内容不被删除,位置指针移动至文件开头,

可进行写和读操作

④以上说法都不正确②④一、单项选择题3.设有以下结构体类型数组的定义,且数组min的10个元素都已赋值,

若要将这些元素写到fp所指向文件中,以下不正确的形式是()。

structabc{inta;charb;floatc[4];}min[10];①fwrite(min,10*sizeof(structabc),1,fp);②for(i=0;i<10;i++)fwrite(min,sizeof(structabc),1,fp);③fwrite(min,5*sizeof(structabc),2,fp);④fwrite(min,sizeof(structabc),10,fp);4.函数调用语句:fseek(fp,-10L,2);的含义是将文件位置指针()。

①从当前位置向文件头方向移动10个字节

②从当前位置向文件尾方向移动10个字节

③移动到距离文件头10个字节处

④移动到距离文件尾10个字节处②④1.以下程序的功能是将文件e1.txt的内容复制到e2.txt中。#include<stdio.h>voidmain(){FILE*fp1,*fp2;charstr[81];;fp1=fopen("e1.txt","r");fp2=fopen("e2.txt","w");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论