C语言基础第13章课件_第1页
C语言基础第13章课件_第2页
C语言基础第13章课件_第3页
C语言基础第13章课件_第4页
C语言基础第13章课件_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

第13章磁盘文件操作(I/O系统)13.1

13.2打开文件和关闭文件

13.3文件的读和写

13.4文件的定位与文件的随机存取

本章介绍ANSI文件I/O系统。包括文件的概念,文件的打开和关闭,数据的读写等。

13.1文件概述13.1.1C语言文件的概念文件(file)是存储在外部介质(如磁盘,磁带)上的,以惟一的名字作为标记的数据集合。操作系统是以文件为单位对数据进行管理的。与主机相连的输入输出设备,其作用也是从设备上读取数据和将数据写到设备上,所以,也把输入输出设备看作是文件。13.1.2二进制文件和文本文件

文件数据的存储,一般有两种形式。一种是以ASCII码的形式,按字节存储的。这样的文件叫做文本文件(textfile),又叫ASCII码文件。另一种是以在内存中的二进制数形式存储的文件,称为二进制文件。13.1.3顺序文件随机文件

按照文件内数据处理方式的不同,文件又分为顺序文件随机文件。

13.1.4缓冲文件系统和非缓冲文件系统系统按对文件的支持方式的不同,分为缓冲文件系统和非缓冲文件系统。所谓缓冲文件系统(buffered)

是指在进行I/O操作时,系统自动为每个打开的文件开辟一个内存缓冲区。数据的输入和输出都是通过缓冲区去进行。

所谓非缓冲文件系统(unbuffered)是指系统不自动开辟内存缓冲区,而是由程序自己为每个文件设定缓冲区。

13.1.5文件型指针在ANSI文件I/O系统中,每个被使用的文件,都在内存开辟一个区,用于存放与文件的相关信息,如文件号(文件在操作系统中被管理的代号),文件的读写状态,文件缓冲区的地址、以及当前的读写缓冲区数据的位置等。这些信息存放在一个结构型变量中。这个结构类型是系统定义的,并通过typedef将该结构型起名为结构型定义在stdio.h文件中。

程序要使用文件,首先必须定义一个FILE型结构的指针变量。这种指向FILE结构型的指针称为文件指针。通过这个指针可以实现对文件的操作。文件指针变量定义的一般形式为:

FILE*文件指针名;

文件关闭的结果,使应用程序不能再对该文件进行输入输出等操作。13.2.1打开文件函数

打开文件函数fopen()的格式为:

FILE*fopen(char*,char*mode)mode功能rw打开一个已存在的文本文件,只能读取(输入)数据打开一个文本文件,只能写入(输出)数据表13.2.113.2.2关闭文件函数

关闭文件函数fclose()的格式是:

intfclose(FILE*fp)

例13.2.1打开文件和关闭文件函数的使用。下面的程序将二进制文件“mydata.dat”以写方式打开,然后关闭该文件。#include<stdio.h>main(){FILE*fp; /*定义文件型指针*/

if((fp=fopen("mydata.dat","wb"))==NULL) /*判断文件是否正确打开*/{printf("'topen!\n");exit(1);}

fclose(fp); /*关闭打开的文件*/}13.2.3标准设备文件系统规定,标准输入设备为键盘,标准输出设备为显示器。当程序运行时,系统自动打开标准设备文件,分配文件号。当程序运行结束时,系统又自动将这些标准设备文件关闭。程序运行时,系统共打开五个标准设备文件,表13.2.2列出来这些标准设备文件的文件名,文件号和文件指针。表13.2.2文件号文件指针标准文件名称文件号文件指针标准文件名称0stdin标准输入3stdaux标准辅助(辅助设备端口)1stdout标准输出4stdprn标准打印2stderr标准错误(指显示器)

13.3文件的读和写对文件的读写是用一系列函数实现的。C语言提供了四组文件读写函数:(1)字符文件读写函数fgetc()和fputc();(2)数据块文件读写函数fread()和fwrite();(3)格式文件读写函数fscanf()和fprintf();(4)字符串文件读写函数fgets()和fputs()。

13.3.1字符文件读写函数1.写字符文件函数fputc()例13.3.1将从键盘输入的一个字符串存入磁盘文件test中。程序如下:

#include<stdio.h>main(){

inti;charstr[80];FILE*fp; /*定义文件指针*/

if((fp=fopen("test","w"))==NULL) /*以写方式打开文件{并判断是否正确打开*/

printf("cannotopenfile.");exit(1);}2.读字符文件函数fgetc()例13.3.2将在例13.3.1中建立的磁盘文件test读出并显示在屏幕上。程序如下:

#include<stdio.h>main(){

charch;charstr[80];FILE*fp; /*定义文件指针*/

if((fp=fopen("test","r"))==NULL) /*以读方式打开文件*/{

printf("cannotopenfile.");exit(1);}

ch=fgetc(fp);/*从文件读取字符*/

while(ch!=EOF){putchar(ch);ch=fgetc(fp);/*从文件读取字符*/}

fclose(fp); /*关闭文件*/

return0;}这个程序的结构与上一个程序基本相同:打开文件,读文件,关闭文件。程序中用了一个while循环语句读字符:

while(ch!=EOF){}

作用是,每读一个字符都要检查,是否读到文件尾。13.3.2文件尾测试函数、错误测试函数和文件头定位函数

为配合文件的读写操作,还要用到一些其他有关函数。这里主要介绍三个函数。1.文件尾测试函数feof()2.文件错误测试函数ferror()例13.3.3应用函数ferror和feof()的例子。程序的功能是复制任意类型的文件,即读入一个文件f1,然后,将其写入另一个文件f2。整个程序分为以下几个部分:(1)打开文件f1(“rb”模式);(2)打开文件f2(“wb”模式);(3)读文件f1;(4)写文件f2;(5)关闭两个被打开的文件。程序的流程如图13.2所示。

图13.2例13.3.3复制文件程序的流程图程序如下:

#include<stdio.h>main(){FILE*fin,*fout; /*定义文件指针*/

charch;

if((fin=fopen("f1","rb"))==NULL) /*rb模式打开文件f1*/{printf("cannotopensourcefile\n");exit(1);}if((fout=fopen("f2","wb"))==NULL) /*wb模式打开文件f2*/{printf("cannotopendestinationfile\n");exit(1);}

while(!feof(fin)) /*判断文件尾*/{

ch=getc(fin); /*读数据*/

if(ferror(fin)) /*检查错误*/{

printf("erroereadingfile.\n");break;}fputc(ch,fout);/*复制(写)数据*/

if(ferror(fout))/*检查错误*/{

printf("errorwritingfile.\n");break;}}

fclose(fin); /*关闭文件*/

fclose(fout); /*关闭文件*/

return0;}3.文件头定位函数rewind()13.3.3字符串文件读写函数1.写字符串文件函数fputs()2.读字符串文件函数fgets()例13.3.4将一字符串写入文件“str”,然后,从文件读出并显示到屏幕。程序如下:#include<stdio.h>main(){charstr[80]="I/Osystem.";charstr1[80];FILE*fp; /*定义文件指针*/

if((fp=fopen("str","w"))==NULL) /*打开文件,模式写*/{

printf("Can'topenthe\n");exit(0);}

fputs(str,fp); /*写入字符串*/

fclose(fp); /*关闭文件*/

if((fp=fopen("str","r"))==NULL) /*打开文件,模式读*/{

printf("Can'topenthe\n");exit(0);}

fgets(str1,12,fp);/*读文件*/

printf("%s\n",str1);fclose(fp); /*关闭文件*/

return;}13.3.4数据块文件读写函数数据块文件读写函数用于二进制文件的读和写。1.数据块文件写函数fwrite()例13.3.5用函数fwrite()以二进制文件方式将一组浮点数写到磁盘文件。程序首先以二进制文件写方式(wb)打开文件fnum。其次,将要写入文件的数据赋给数组fnum[]。最后,用fwrite()将数组中的数据写入磁盘文件fnum中。程序如下:

#include<stdio.h>main(){

FILE*fp; /*定义文件指针*/

floatfnum[10];inti;

if((fp=fopen("fnum","wb"))==NULL) /*打开文件,写模式*/{

printf("cannotopenfile.");exit(1);}for(i=0;i<10;i++)fnum[i]=i/2.0;

if(fwrite(fnum,sizeof(fnum),1,fp)!=1) /*写数据*/

printf("");

fclose(fp); /*关闭文件*/

return0;}2.数据块文件读函数fread()例13.3.6把例13.3.5的程序所建立的磁盘文件读出并显示在显示器屏幕上。程序首先以二进制文件读模式打开文件fnum。其次,用fread()函数读打开文件中的数据。用printf()将读出的数据显示在显示器的屏幕上。最后,关闭打开的文件。

程序如下:

#include<stdio.h>main(){floatfnum[10];FILE*fp; /*定义文件指针*/

inti;

if((fp=fopen("fnum","rb"))==NULL) /*打开文件,读模式*/{

printf("cannotopenfile");exit(1);}if(fread(fnum,sizeof(fnum),1,fp)!=1) /*读数据*/

printf("");

for(i=0;i<10;i++) /*显示数据*/

printf("%g",fnum[i]);

fclose(fp); /*关闭文件*/

return0;}程序的输出为:00.511.522.533.544.5例13.3.7编写程序。定义一个含有三个成员(inti,floatf,charc)的结构型x。将两个结构型数据写入磁盘文件,然后,从文件中读出数据并输出到显示器。程序如下:

#include<stdio.h>main(){structx /*定义结构型x*/{inti;floatf;charc;}a1[2],a[2]={{1,1.1,'a'},{2,2.2,'b'}};

FILE*p; /*定义文件指针*/

intk;

if((p=fopen("funm","wb"))==NULL) /*打开文件,写模式*/{printf("openerror\n");exit(1);}fwrite(a,sizeof(structx),2,p); /*写文件*/

fclose(p); /*关闭文件*/

if((p=fopen("funm","rb"))==NULL) /*打开文件,读模式*/{printf("openerror\n");exit(1);}

fread(a1,sizeof(structx),2,p); /*读文件*/

fclose(p); /*关闭文件*/

for(k=0;k<2;k++) /*输出数据*/

printf("%d%f%c\n",a1[k].i,a1[k].f,a1[k].c);}13.3.5格式化读写文件函数1.格式化写函数fprintf()2.格式化读函数fscanf()例13.3.8

从键盘输入三个数据(分别为字符串,浮点数和整型数),然后,将它们存入磁盘文件“data”。

程序把键盘看作是一标准输入文件。这可以通过标准流stdin与其建立起联系。因此,可以用函数fscanf()读取键盘。写入磁盘文件是通过函数fprintd()完成的。整个程序的结构如下:(1)建立文件指针;(2)打开文件并获得文件指针;(3)读键盘文件;(4)将读到的数据写入磁盘文件;(5)关闭文件。程序如下:

#include<stdio.h>main(){FILE*fp; /*定义文件指针*/

charstr[10];floatfval;intk;

if((fp=fopen("data","w"))==NULL) /*打开文件*/{

printf("cannotopenfile");exit(1);}

printf("Enterastring,float,int:");fscanf(stdin,"%s%g%d",&str,&fval,&k); /*从键盘读取数据*/

fprintf(fp,"%s%g%d",str,fval,k); /*数据写入文件*/

fclose(fp); /*关闭文件*/

return0;}例13.3.9编写程序,将例13.3.8中建立的文件“data”读出并输出到打印机。打印机作为标准输出设备文件。

#include<stdio.h>main(){FILE*fp; /*定义文件指针*/

charstr[10];floatfval;intk;

if((fp=fopen("data","r"))==NULL) /*以r模式打开文件*/{

printf("cannotopenfile");exit(1);}

fscanf(fp,"%s%g%d",&str,&fval,&k); /*读文件数据*/

fprintf(stdprn,"%s%g%d\n",str,fval,k); /*输出到打印机*/

fclose(fp);return0;}13.4文件的定位与文件的随机存取前面讲的文件I/O操作,都是从文件的头开始顺序进行的。这样的I/O操作称为顺序存取。相应的文件叫做顺序文件。将一个数据写到文件的任意指定的位置或读文件中任意指定位置的数据,这样的I/O操作叫做随机存取操作,相应的文件叫做随机文件。我们知道,I/O系统在文件中设置有一个内部位置指针(内部指针),用来指向当前的读写位置。对于顺序存取的文件,每次读写一个数据,位置指针就自动指向下一个数据。如果想要改变这种顺序存取模式,就得人为地改变位置指针所指向的位置。这个操作叫做文件的读写定位。文件的读写定位可通过调用文件随机定位系统函数实现。13.4.1文件随机定位函数文件定随机定位函数fseek()的格式为:

intfseek(FILE*fp,longoffset_bytes,intorigin)13.4.2随机读写文件举例例13.4.1在文件fdata有六个结构类型数据(结构包含一个整型变量a,一个浮点型变量b,一个字符型变量c)。要求将用户指定的数据输出到屏幕显示。首先,用下面的程序制作一个fdata文件。程序第一步定义结构类型并进行初始化;第二步用函数fopen()以“wb”模式建立文件fdata;最后,用函数write()将结构类型数据写入文件,随后关闭文件。#include<stdio.h>main(){structdata /*定义结构型*/{

inta;floatb;charc;

};

FILE*fp; /*定义文件指针*/

inti;

structdatad[6]= /*定义结构变量并初始化*/{{1,1.1,'a'},{2,2.2,'b'},{3,3.3,'c'},{4,4.4,'d'},{5,5.5,'e'},{6,6.6,'f'}};

if((fp=fopen("fdata","wb"))==NULL) /*打开文件fdata*/{printf("Cnnotopenfile.\n");exit(0);}

for(i=0;i<=5;i++)/*数据写入文件*/

fwrite(&d[i],sizeof(structdata),1,fp);

fclose(fp);/*关闭文件*/

return;}

下面的程序对文件fdata进行随机读取。首先,通过键盘输入所要读的数据的序号(0~5);第二步根据输入的数据设置函数fseek();第三步用函数fread()读文件中指定的数据;第四步将读出的数据显示到显示器屏幕。#include<stdio.h>main(){structdata /*定义结构型data*/{inta;floatb;charc;}d[6];

FILE*fp;/*定义文件指针*/

inti;if((fp=fopen("fdata","rb"))==NULL

温馨提示

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

评论

0/150

提交评论