第13章 文件3.ppt_第1页
第13章 文件3.ppt_第2页
第13章 文件3.ppt_第3页
第13章 文件3.ppt_第4页
第13章 文件3.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、第十三章 文 件,13.1 概述,一、文件,定义:指存储在磁盘、磁带等外设上的数据的集合。,二、数据的输入和输出,1、终端 从键盘输入数据,运行结果在显示器输出 2、磁盘文件 从磁盘文件读入数据,结果写入磁盘文件,三、C 语言文件,C 文件:是由一连串的字符(字节)的数据组成(流式文件)。,数据组织形式:ASCII 文件(字节流) 二进制文件(二进制流) C语言对文件的存取是以字符(字节)为单位,四、文件处理方法,1、缓冲文件系统:指系统自动地在内存区为每 一个正在使用的文件名开辟一个缓冲区。 ANSI C 标准采用 2、非缓冲文件系统:指系统不自动开辟确定大小的缓冲区,由程序为每个文件设定缓

2、冲区。,五、文件的读写,采用库函数实现,13.2 文件类型指针,一、文件的结构体类型,系统定义的结构体类型:(在stdio.h中) typedef struct int -fd; /* 文件号 */ int -cleft; /* 缓冲区中剩下的字符 */ int -mode; /* 文件操作模式 */ char * -nextc; /* 下一个字符模式 */ char * -buff; /* 文件缓冲区位置 */ FILE;,被使用文件的有关信息保存在文件的结构体类型的变量中。,二、定义文件型指针变量,FILE *fp;,使fp指向某个文件的结构体变量并访问该文件,13.3 文件的打开与关闭,

3、文件读写前:打开文件 使用结束后:关闭文件,一、文件的打开 (fopen 函数),FILE *fp; fp = fopen(“A1”,“r”);,使用文件方式详见表 12.1, P270 “r” 只读文本文件(打开的文件必须已存在) “w” 只写文本文件(若文件不存在则新建立) “rb” 只读二进制文件 “wb” 只写二进制文件 ,fopen函数若不能实现“打开”任务,则返回一个出错信息。常用方法: if ( (fp = fopen(“file1”,”r”) = NULL) printf(“ cannot open this file n”); exit (0); ,二、 文件的关闭 ( fc

4、lose 函数),fclose ( fp ); 关闭 fp 所指向的文件,12.4 文件的读写,一、fputc 函数和fgetc函数 (putc函数和getc函数),例:从磁盘文件顺序读入字符并显示在屏幕上 ch=fgetc(fp); 或 while ( ! feof(fp) ) while (ch!=EOF) ch=fgetc(fp); putchar(ch); putchar(ch); ch=fgetc(fp); ,例 13.1 从键盘输入一些字符,并输出到磁盘,直到输入一个“#”为止。 #include “stdio.h” main() FILE *fp; char ch,filenam

5、e10; scanf(“%s”,filename); if(fp=fopen(filename,”w”)=NULL) printf(“cannot open filen”); exit(0); ,ch=getchar(); while(ch!=#) fputc(ch,fp);putchar(ch); ch=getchar(); fclose(fp); 运行如下: file1.c (输入磁盘文件名) computer and c# (输入一个字符串) computer and c (输出一个字符串),验证 file1.c文件中的内容: C type file.c computer and c,例

6、13.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 #include “stdio.h” main( ) FILE *in, *out; char ch, infile10, outfile10; printf(“ Enter the infile name: n”); scanf(“ %s “,infile); printf(“Enter the outfile name: n”); scanf(“ %s “,outfile);,if ( in=fopen(infile, “r”)=NULL) printf (“cannot open infilen”); exit(0); if (o

7、ut=fopen(outfile, “w”)=NULL) printf (“cannot open outfilen”); exit(0); while ( !feof(in) fputc(fgetc(in),out); fclose (in); fclose(out); ,运行如下: Enter the infile name : file1.c (输入原有磁盘文件名) Enter the outfile name : file2.c (输入新复制的磁盘文件名) 验证结果: C type file1.c computer and c (file1.c中的信息) C type file2.c

8、computer and c (file2.c中的信息),可利用main函数的参数,在输入命令行时输入两个文件名, 程序改为:,程序文件名:exam12_2.c #include “stdio.h” main( argc,argv) int argc; char *argv ; FILE *in, *out; char ch; if (argc!=3) printf(“You forgot to enter a filenamen”); exit(0); if (in=fopen(argv1,”r”)=NULL) printf(“ cannot open infilen”); exit(0);

9、 ,if (out=fopen(argv2,”w”)=NULL) printf(“ cannot open outfilen”); exit(0); while(!feof(in) fputc(fgetc (in),out); fclose(in); fclose(out); ,二、fread函数和 fwrite函数,fread (buffer,size,count,fp); 从指定文件读取数据项 fwrite (buffer,size,count,fp); 把数据项写到指定文件,fread、fwrite调用成功 函数返回值=count的值,例 13.3 从键盘输入4个学生的有关数据,然后把它

10、 们转存到磁盘文件上去。 #include “stdio.h” #define SIZE 4 struct student_type /* student_type结构体变量 char name10; 的长度=29字节 */ int num; int age; char addr15; stud SIZE; void save ( ) FILE *fp;,int i; if ( fp=fopen(“stu_list”,”wb”)=NULL) printf(“cannot open filen”); return; for (i=0;iSIZE;i+) if( fwrite( main( ),i

11、nt i; for(i=0;iSIZE;i+) scanf(“%s%d%d%s”,, 运行如下: 输入4个学生的姓名、学号、年龄和地址: zhang 1001 19 room_101 fun 1002 20 room_102 tan 1003 21 room_103 ling 1004 21 room_104,验证磁盘文件“stu_list”中数据,程序如下: #include “stdio.h” #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE;

12、main( ) int i;,FILE *fp; fp=fopen(“stu_list”,“rb”); for(i=0;iSIZE;i+) fread( 运行结果: zhang 1001 19 room_101 fun 1002 20 room_102 tan 1003 21 room_103 ling 1004 21 room_104,fread和fwrite是按数据块的长度来处理,故一般用于二进制文件的输入输出,三、fprintf函数和fscanf函数,fprintf (文件指针,格式字符串,输出列表); 按格式将数据输出到指定文件 fscanf ( 文件指针,格式字符串,输入列表); 从

13、指定文件按格式输入数据,如: fprintf( fp,”%d,%6.2f”,i,t);,fscanf( fp,”%d,%f ”,fscanf和fprintf是按数据格式处理,故一般 用于文本文件的输入输出,三、其它读写函数,1、putw和getw函数(非ANSI C标准定义) 功能:对磁盘文件读写一个字(整数) 如: putw(10,fp); 将整数10输出到fp所指的文件 i=getw(fp); 从fp所指文件读一个整数赋给i,2、读写其它类型数据 ANCI C提供的fread和fwrite函数,可方便读写任何类型数据。 用户也可自己定义所需函数。,例:定义函数putfloat : 向磁盘文

14、件写一个实数(用二进制方式) putfloat( num,fp) float num; FILE *fp; char *s; int count; s= 同理,可编写读写任何类型数据的函数,3、fgets函数和fputs函数 fgets :从指定文件读入一个字符串 fputs:向指定文件输出一个字符串 如: fgets(str,n,fp); 从fp所指文件输入n-1个字符,在最后 加一个0存入字符数组str中 fputs(“China”,fp); 将“China”输出到fp所指文件,13.5 文件的定位,一、rewind 函数,文件的位置指针:指向当前读写的位置,例 12.4 将一磁盘文件显示

15、在屏幕上,然后把它复制到另一文件中。 #include “stdio.h” main( ) FILE *fp1,*fp2; fp1=fopen(“file1.c”,”r”); fp2=fopen(“file2.c”,”w”); while(!feof(fp1) putchar(getc(fp1);,功能:使位置指针重新返回文件的开头,rewind(fp1); /* 使file1.c位置指针重定位于文件头*/ while(!feof(p1) putc(getc(fp1),fp2); fclose(fp1);fclose(fp2); ,二、fseek函数和随机读写,fseek (文件类型指针,位移

16、量, 起始点),fseek函数一般用于二进制文件,如: fseek(fp,100L,0); 位置指针移到离文件头100个字节处 fseek(fp,50L,1);位置指针移到离当前位置50个字节处 fseek(fp,-10L,2);位置指针从文件尾向后退10个字节,例13.5 磁盘文件上存有10个学生的数据。要求将 第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示。 #include “stdio.h” struct student_type char name10; int num; int age; char sex; stud10;,main( ) int i; FILE *fp;

17、 if(fp=open(“stud_dat”,”rb”)=NULL) printf(“cannot open filen”); exit(0); for (i=0;i10;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread( ,三、ftell函数,如: i=ftell(fp); if(i=-1L) printf(“errorn”);,13.6 文件的出错,一、ferror函数,二、clearerr函数,clearerr(fp); 使文件错误标志和文件结束标志 置为0 此时,ferror(fp)的值为0,13.7 非缓冲文件系统,不属于A

18、NSI C标准,缓冲I/O系统: 高级I/O系统 系统提供文件缓冲区 通过文件指针访问文件,非缓冲I/O系统: 低级I/O系统 自己设定缓冲区 用整数表示文件,一、 open函数,open (“Li_1”,0); 打开Li_1文件且只用于输入,一般用法: if(fd=open(“A”,1)= -1) printf(“cannot open filen”); exit(0); ,二、close 函数,close (fp); 关闭已打开的文件,三、creat 函数,fd=creat(“A”,1); 建立新文件,四、read 函数,read(fd,buf,count);,例13.6 从“a1”文件中

19、读50个字符到buffer 数组 并显示该字符串。 main() int fd; char buffer50; /* bufffer为设定的缓冲区 */ if(fd=open(“a1”,0)=-1) printf(“cannot open filen”); exit(0); if(read(fd,buffer,50)!=50) printf(“read error”); printf(“%sn”,buffer); close(fd); ,五、write 函数,write(fd,buf,count);,例13.7 从终端键盘读入50个字符,然后输出到磁盘文件“a1”中。 main( ) int

20、fd; char buffer50; if(fd=creat(“a1”,1)=-1) /* 建立新文件“a1”*/ printf(“cannot open filen”); exit(0); gets(buffer); /* 从键盘读入字符串*/ if(write(fd,buffer,50)!=50) printf(“write error”); close(fd); ,例13.8从键盘读入若干行文字串,并将它们写到磁盘文件中,然后再从文件读入内存,在屏幕上显示。 #include “stdio.h” #define COUNT 80 main() /* 用非缓冲I/O系统输入输出 */ char bufCOUNT; int fd1,fd2; if(fd1=open(“A”,1)=-1) /*打开A文件,写入*/ printf(“connot open filen”); exit(0); input(buf,fd1); /* 执行input函数,从键盘读 入数据并写到文件“A”中*/,close(fd1); if (fd2=open(“A”,0

温馨提示

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

评论

0/150

提交评论