C语言程序设计课件第10章 文件_第1页
C语言程序设计课件第10章 文件_第2页
C语言程序设计课件第10章 文件_第3页
C语言程序设计课件第10章 文件_第4页
C语言程序设计课件第10章 文件_第5页
已阅读5页,还剩28页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

大学计算机基础网络信息中心教研室1第十章文件1.理解文件的含义以及文件的分类方法。

2.了解由系统定义的文件类型指针。

3.掌握标准文件操作中的常用函数,文件的打开与关闭、文件的读写操作等。

4.了解文件的辅助操作函数,文件的定位、文件的状态检测函数等。【教学要求】大学计算机基础网络信息中心教研室2第10章文件文件类型与文件指针标准文件操作文件的定位和状态检测函数

【教学内容】大学计算机基础网络信息中心教研室310.1文件类型与文件指针

所谓文件,是指存储在外部介质上的数据的集合,是一批逻辑上有联系的数据。这个数据集的名称就是文件名。(1)从用户的角度看,文件可分为普通文件和设备文件两种。文件的分类

普通文件是指存储在外部介质上的数据的有序集合。可以是源文件、目标文件和可执行程序,也可以是一组待输入处理的原始数据,或者是一组输入的结果。

设备文件是指在计算机中与主机相连的各种外部设备,如显示器、打印机和键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,如前面经常使用的printf()和putchar()就是这类输出。键盘通常被指定为标准输入文件,如scanf()和getchar()就属于这类输入。大学计算机基础网络信息中心教研室4(2)从文件中数据的组织形式看,文件可分为字符代码文件(也称文本文件)和二进制文件两种。文本文件是指文件的内容是由一个一个的字符组成的,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码,所以有时也称ASCII码文件。例如ASCII码文件中的一个整数337,输出在纸上只是3个字符,当输出到磁盘上时,一个字符占一个字节,共占3个字节。ASCII码文件可在屏幕上按字符显示,可用DOS中的命令TYPE显示文件的内容。例如源程序文件就是ASCII码文件,由于是按字符显示,因此能读懂文件内容。二进制文件是指以数据在内存中的存储形式原样输出到磁盘上。例如整数337在内存中以int形式存放,占2个字节,当以二进制文件形式输出到磁盘上时,也是占2个字节。二进制文件也可显示在屏幕上,用二进制形式输出数值,可以节省外存空间和转换时间,但内容无法读懂。一般中间结果数据需要暂时保存在外存上以后又需要输入到内存的,常用二进制文件保存。大学计算机基础网络信息中心教研室52.缓冲文件系统和非缓冲文件系统

在缓冲文件系统中,系统自动在内存中为每个正在使用的文件开辟一个缓冲区,文件的存取都是通过缓冲区进行的。缓冲区相当于一个中转站,它的大小由具体的C版本规定,一般为512字节。缓冲文件系统原来用于处理文本文件。在非缓冲文件系统中,系统不为所打开的文件自动开辟缓冲区,缓冲区的开辟由程序完成。非缓冲文件系统原来用于处理二进制文件。文件系统(对文件的处理方式)可分为缓冲文件系统和非缓冲文件系统两大类大学计算机基础网络信息中心教研室6

3.内部文件和外部文件

存放在外部介质上的文件称为外部文件,通过文件名标识.C程序中的文件称为内部文件,用文件指针来描述。程序中要实现对文件的处理,先必须在内部文件与外部文件之间建立联系,打开文件;然后方可对文件进行操作。文件最基本的操作是读写操作;操作完成应当切断内部文件与外部文件之间的联系,关闭文件。对文件进行的所有操作通过C编译系统提供的标准函数完成,这些函数的信息包含在头文件“stdio.h”中。大学计算机基础网络信息中心教研室7文件类型指针

缓冲文件系统在处理文件时,会为每一个文件开辟一个“信息区”,用来存放文件的一系列信息(如文件的名字、文件的当前读写位置以及文件状态标志等)。这些信息被保存在一个特定的结构体类型变量中,这种特定的结构体类型称为文件类型,由系统定义的,取名为FILE,包含在头文件stdio.h中。其定义如下:typedefstruct{ shortlevel;/*缓冲区"满"或"空"的程度*/ unsignedflags;/*文件状态标志*/ charfd;/*文件描述符*/ unsignedcharhold;/*如无缓冲区不读取字符*/ shortsize;/*缓冲区的大小*/ unsignedchar*buffer;/*数据缓冲区的位置*/ unsignedchar*curp;/*当前活动指针*/ unsignedistemp;/*文件临时指示器*/ shorttoken;/*用于有效性检查*/}FILE;大学计算机基础网络信息中心教研室8对文件的描述,往往通过指向文件的文件指针变量来进行。定义文件指针的一般形式为:FILE*指针变量名;/*FILE为大写*/例如:FILE*fp;表示定义了一个文件类型的指针变量fp,只要将一个文件类型的结构体变量的地址赋给fp,fp便指向该文件类型的结构体变量。也可理解为fp指向该文件,随后便可以利用fp实现对该文件的各种操作。大学计算机基础网络信息中心教研室910.2标准文件操作文件的打开在使用文件之前要调用fopen()将文件打开,若打开成功,则得到一个指针,称为文件指针,利用该指针可以继续对文件进行各种操作,调用各种有关文件读写函数;若打开失败,得到一个空指针(NULL),对文件的操作终止。文件操作完成时,要及时调用fclose()将文件关闭,以防止数据丢失或文件的内容遭到破坏。文件的打开用fopen函数实现,其调用的一般格式为:fopen(文件名,文件打开方式);例如:FILE*fp1;fp1=fopen(“d:\\program\\exer.dat”,

“rb”

)

;大学计算机基础网络信息中心教研室10

文件打开方式 含义

r只读 为输入打开一个文本文件

w只写 为输出打开一个文本文件

a追加 向文本文件追加数据

rb只读 为输入打开一个二进制文件

wb只写 为输出打开一个二进制文件

ab追加 向二进制文件追加数据

r+读写 为读/写打开一个文本文件

w+读写 为读/写建立一个文本文件

a+读写 为读/写打开一个文本文件

rb+读写 为读/写打开一个二进文件

wb+读写 为读/写建立一个二进文件

ab+读写 为读/写打开一个二进文件文件的使用方式大学计算机基础网络信息中心教研室11常用下面的方法打开一个文件:if((fp=fopen("f:\\c\\exer.txt","r"))==NULL){ printf("\nCannotopenfile!\n"); getch();

/*从键盘接收一个字符,此处用于等待*/ exit(1);}

在打开文件出错时,fopen()将返回一个空指针NULL,程序中可用这一信息来判别是否成功地打开一个文件,并做相应的处理。大学计算机基础网络信息中心教研室12说明:

(1)不是所有编译系统均提供以上12种文件使用方式。(2)用″r″、″rb″方式打开的文件必须已经存在。(3)用″w″、″wb″方式打开的文件,可以存在也可以不存在。不存在时,则新建文件;存在时,重新建立,原文件内容不被保留。(4)在读写文本文件时,对回车换行符要进行转换,读时回车换行符转换成换行符,写时回车换行符转换成回车、换行两个字符。对二进制文件,不进行这种转换。大学计算机基础网络信息中心教研室13(5)程序运行时,系统自动打开标准输入stdin、标准输出stdout、标准出错输出stderr三个标准文件。stdin、stdout、stderr由系统自动定义,可直接使用。(6)标准设备文件可与普通文件一样操作,但将产生特殊效果。如写到打印机,将在程序中实现打印输出控制。大学计算机基础网络信息中心教研室14文件的关闭

文件在使用完后,应及时关闭。文件的关闭用fclose()函数完成,调用方式为:

fclose(文件指针变量);关闭文件将使文件指针变量与文件名脱钩,即指针变量不再指向该文件。文件关闭后不能再用该指针变量对文件进行操作,该指针变量可再指向其它文件。顺利执行了关闭操作,将返回函数值0。如返回一个非0值,则表示文件关闭出错。大学计算机基础网络信息中心教研室15文件的读/写操作

字符读写函数:fgetc()和fputc()

字符串读写函数:fgets()和fputs()

格式化读写函数:fscanf()和fprintf()

数据块读写函数:fread()和fwrite()1.字符读写函数:fgetc()和fputc()(1)fputc()用fputc()函数可以将指定的单个字符输出到磁盘文件上去,其调用的一般格式为:fputc(字符变量或常量,文件指针变量);该函数的功能是将参数中指定的字符输出到文件指针所指向的磁盘文件中去。如果函数执行成功,返回被输出的字符;否则返回EOF。大学计算机基础网络信息中心教研室16#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; charch,filename[20];scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("\nCannotopenfile!\n"); exit(1);} ch=getchar();/*接收scanf语句输入后的回车*/ ch=getchar();/*接收第一个字符*/ while(ch!='\n') { fputc(ch,fp); putchar(ch); ch=getchar(); } printf("\n"); fclose(fp);}【例10-1】将键盘输入的一些字符输出到磁盘文件中,直到遇到“回车”为止。f:\c\exer.txt↙Everythinghasitsbeginning!↙Everythinghasitsbeginning!Pressanykeytocontinue大学计算机基础网络信息中心教研室17(2)fgetc()函数用fgetc()可以一次从磁盘文件中读取一个字符,该文件必须是以读或读写方式打开的。其调用的一般格式为:字符变量=fgetc(文件指针变量名);

该函数的功能是从文件指针所指向的文件内读取一个字符,即fgetc()的返回值。如果在执行fgetc()时遇到文件结束符,则返回一个文件结束标志EOF(stdio.h文件中定义的符号常量,值为-1)。大学计算机基础网络信息中心教研室18【例10-2】从磁盘文件中读取一个字符。#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; charch; if((fp=fopen("f:\\c\\exer.txt","r"))==NULL)

/*其中第一个"\"为转义字符*/ { printf("\nCannotopenfile!\n"); getch(); exit(1); } while((ch=fgetc(fp))!=EOF) putchar(ch); printf("\n"); fclose(fp);}Everythinghasitsbeginning!Pressanykeytocontinue大学计算机基础网络信息中心教研室192.字符串读写函数:fgets()和fputs()(1)fputs()

用fputs()函数可以将指定的字符串输出到磁盘文件中,其调用的一般格式为:fputs(字符串,文件指针变量);

该函数的功能是将字符串输出到文件指针所指向的文件中去,但字符串结束标志'\0'不输出。其中字符串可以是字符串常量,也可以是字符数组名或指针变量。大学计算机基础网络信息中心教研室20【例10-3】从键盘上输入3个字符串,将它们输出到一个磁盘文件中。#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; inti; charstr[30]; if((fp=fopen("f:\\c\\exer.txt","w"))==NULL) { printf("\nCannotopenfile!\n"); getch(); exit(1);} for(i=1;i<=3;i++) { gets(str); fputs(str,fp); fputs("\n",fp); } fclose(fp);}假设现在输入的3个串是:Everythinghasitsbeginning!Timeismoney!Allthatglittersisnotgold!则文件中将有如上的内容。大学计算机基础网络信息中心教研室21(2)fgets()

用fgets()可以从磁盘中读取一个字符串到字符数组中,其调用的一般格式为:

fgets(字符数组名,n,文件指针变量);

该函数功能是从文件指针所指向的文件中读取n-1个字符,并把它存放到字符数组中。如果在读入n-1个字符完成之前遇到“回车”或文件结束标志EOF,则结束读取。但它会将遇到的换行符“\n”也作为一个字符送入字符数组中。在字符串读入后会自动加上一个字符串结束标志“\0”。函数返回值是字符数组的首地址,若出错则返回NULL。大学计算机基础网络信息中心教研室22【例10-4】从磁盘文件中读回字符串并在屏幕上显示#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; charstr[31];/*字符数组中可容纳的最多字符数*/ if((fp=fopen("f:\\c\\exer.txt","r"))==NULL) { printf("\nCannotopenfile!\n"); getch(); exit(1); } while(fgets(str,31,fp)!=NULL) printf("%s",str); printf("\n");fclose(fp);}Everythinghanitsbeginning!Timeismoney!Allthatglittersisnotgold!Pressanykeytocontinue大学计算机基础网络信息中心教研室233.格式化读写函数:fscanf()和fprintf()(1)fprintf()

用fprintf()可以将数据以一定的格式输出到磁盘文件中去,其调用的一般格式为:

fprintf(文件指针变量,格式控制字符串,输出项列表);

该函数功能是将各输出项以格式控制字符串中所指定的格式输出到文件指针所指向的磁盘文件中去。(2)fscanf()

用fscanf()函数可以以一定的格式将数据从磁盘文件中读取出来,其调用的一般格式为:

fscanf(文件指针变量,格式控制字符串,变量地址列表);

该函数功能是以格式控制字符串中所指定的格式将数据从文件指针所指向的文件中读取出来,然后分别送给指定的变量。大学计算机基础网络信息中心教研室24【例10-5】将数据格式化输出到磁盘文件中。#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; charch; intx; floatf; printf("从键盘输入3个数据,分别是字符、整型、实型:"); scanf("%c%d%f",&ch,&x,&f); if((fp=fopen("f:\\c\\exer.txt","w"))==NULL) { printf("\nCannotopenfile!\n"); getch(); exit(1); } fprintf(fp,"%c%4d%7.2f\n",ch,x,f); fclose(fp);}假设从键盘输入的数据为:a3737.89↙大学计算机基础网络信息中心教研室25【例10-6】从磁盘文件中读取格式化数据,并在屏幕上显示出来。#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp; charch; intx; floatf; if((fp=fopen("f:\\c\\exer.txt","r"))==NULL) { printf("\nCannotopenfile!\n"); getch(); exit(1); } fscanf(fp,"%c%4d%7f",&ch,&x,&f);

/*格式串的书写规则同scanf函数*/ printf("%c%04d%07.2f\n",ch,x,f); fclose(fp);}a00370037.89Pressanykeytocontinue大学计算机基础网络信息中心教研室264.数据块读写函数:fread()和fwrite()(1)fwrite()

用fwrite()可以将一批数据作为一个整体一次性写入磁盘文件。其调用的一般格式为:

fwrite(buffer,size,count,fp);

其中,buffer是一个指针,存放要输出数据的起始地址;size表示要读写的字节数;count是输出的次数;fp是文件指针。该函数的功能是从buffer所代表的起始地址开始,每次输出size大小的数据块,共count次,输出到fp所指定的磁盘文件内。函数调用成功则返回输出数据项的个数(count的值)。(2)fread()

用fread()可以将磁盘文件中的一批数据作为一个整体一次性读出来。其调用的一般格式为:

fread(buffer,size,count,fp);

该函数的功能是从fp所指向的磁盘文件中,每次读取size大小的数据块,存放到以buffer开始的内存中,共count次。函数调用成功则返回count的值。大学计算机基础网络信息中心教研室27#include"stdio.h"#include"stdlib.h"#include"conio.h"#defineN3structworker{ intnum;/*职工工号*/ charname[20];/*职工姓名*/ intage;/*职工年龄*/ intpay;/*职工的工资*/}work[N];【例10-7】从键盘上输入一批工人信息并保存到磁盘文件中。大学计算机基础网络信息中心教研室28main(){inti;FILE*fp;charfilename[30];printf("\n输入文件名:");gets(filename);if((fp=fopen(filename,"wb"))==NULL)/*以二进制写方式打开文件*/{ printf("\n不能打开文件%s!",filename); getchar(); exit(1);}for(i=0;i<N;i++)/*通过键盘输入工人信息并写入文件*/{printf("输入职工的工号、姓名、年龄和薪水:\n");scanf("%d%s%d%d",&work[i].num,work[i].name,&work[i].age,&work[i].pay);}for(i=0;i<N;i++) if(fwrite(&work[i],sizeof(structworker),1,fp)!=1) printf("写文件出错!\n");fclose(fp);/*关闭文件*/ }假设现在输入文件名f:\c\worker.dat↙1001张强283500↙1002张磊303800↙1003李闯324600↙大学计算机基础网络信息中心教研室29【例10-8】把上例中保存在磁盘文件中的职工信息输出到显示器上。main(){ inti; FILE*fp; charfilename[30]; printf("\n输入文件名:"); gets(filename); if((fp=fopen(filename,"rb"))==NULL)

/*以二进制读方式打开文件*/ { printf("\n不能打开文件%s!",filename); getchar(); exit(1); } printf("\n工号\t姓名\t年龄\t工资\n"); for(i=0;i<N;i++) {fread(&work[i],sizeof(structworker),1,fp);

/*从文件中读信息并显示*/ printf("%5d%10s%5d%7d\n",work[i].num,work[i].name,work[i].age,work[i].pay); } fclose(fp);}工号姓名年龄工资1001张强2835001002张磊3038001003李闯324600Pressanykeytocontinue大学计算机基础网络信息中心教研室3010.3文件辅助操作

文件的定位操作1.rewind()函数利用rewind()函数可以使位置指针重新返回到文件的开头。其调用的一般格式为:rewind(文件指针变量);该函数没有返回值。2.随机定位函数fseek()利用fseek()函数可以将位置指针移动到所需的位置,其调用的一般格式为:

fseek(文件指针变量,位移量,起始点);该函数以“起始点”为基点,向前或向后移动“位移量”的字节数,“位移量”为正则是从文件开头向末尾移动,否则移动方向相反。大学计算机基础网络信息中心教研室31#include"stdio.h"#include"stdlib.h"#include"conio.h"main(){ FILE*fp1,*fp2;

fp1=fopen("f:\\c\\wenben\\exer.txt","r"); fp2=

温馨提示

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

最新文档

评论

0/150

提交评论