lesson20数据的组织结构二文件.ppt_第1页
lesson20数据的组织结构二文件.ppt_第2页
lesson20数据的组织结构二文件.ppt_第3页
lesson20数据的组织结构二文件.ppt_第4页
lesson20数据的组织结构二文件.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、2020/8/23,Lesson 20 数据的组织结构,2020/8/23,学习目标:,1,学会读写文件,2020/8/23,问题:,1,每次程序运行得到结果,下次再运行,我还需要怎么办? 在程序运行时,不想从键盘输入数据,而是将其保存在某一个地方,运行时直接去“拿”,怎么办?,2020/8/23,文件:是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。,例如: C:24000101program.c,其中k:24000101就是路径,program.c是文件名。当需要使用文件的时候,需要将文件调入内存中。,2020/8/23,从文件编码和数据的组织方式来看,文件可分为ASCII

2、码文件和二进制码文件。,也叫文本文件,2020/8/23,ASCII文件:文件在磁盘中存放时每个字符占一个字节,每个字节存放相应字符的ASCII码。 二进制文件:存储介质上保存的数据采用与内存数据一致的表示形式存储。,例: 在文件中存放2008,2020/8/23,文件的基本操作 定义文件指针 定义格式为:FILE* ; 例如 FILE *fp; 文件的打开 = fopen(,) fp = fopen(c:file.dat, r); if (fp= NUUL) printf(“nCannot open the file”); return 1; ,2020/8/23,打开文件文件方式,2020

3、/8/23,用“w”方式打开文件时,只能从内存向该文件输出(写)数据, 而不能从文件向内存输入数据,文件中原来的数据保留,2020/8/23,读文件基本过程,#include stdio.h int main() int i,x; FILE * fp ; fp=fopen(array.txt,r); if(fp=NULL) printf(文件不存在); exit(0); printf(从文件中读取的数据:n); for(i=1;i10;i+) fscanf(fp,%d, ,1、定义FILE 指针,2、打开文件,3、确保文件有效,4、用函数读文件,5、关闭文件,20_a.c,2020/8/23,

4、写文件基本过程,#include stdio.h int main() int i,x; FILE * fp ; fp=fopen(array2.txt,“w); if(fp=NULL) printf(文件不存在); exit(0); printf(从文件中读取的数据:n); for(i=1;i10;i+) scanf(%d, ,1、定义FILE 指针,2、打开文件,3、确保文件有效,4、用函数往文件写数据,5、关闭文件,20_b.c,2020/8/23,a和w的区别,#include stdio.h int main() int i,x; FILE * fp ; fp=fopen(array

5、.txt,“a); if(fp=NULL) printf(文件不存在); exit(0); printf(从文件中读取的数据:n); for(i=1;i10;i+) scanf(%d, ,打开文件方式,20_c.c,2020/8/23,二进制文件和文本文件,#include stdio.h int main() int i,x; FILE * fp ; fp=fopen(array4.txt,wb); if(fp=NULL) printf(文件不存在); exit(0); printf(将从键盘输入数据写入文件:n); scanf(%d, ,20_d.c,2020/8/23,#include

6、stdio.h int main() int i,x; FILE * fp ; fp=fopen(array5.txt,w); if(fp=NULL) printf(文件不存在); exit(0); printf(将从键盘输入数据写入文件:n); scanf(%d, ,二进制文件和文本文件,20_e.c,2020/8/23,字符读写操作 1、fgetc( )的调用格式: = fgetc(); 例如:ch = fgetc(fp); 语句功能是:从fp指向的文件中读取一个字符并将这个字符赋给char型变量ch 。 2、fputc( )的调用格式: fputc(,); 例如: fputc(ch, f

7、p); 语句功能是:将字符型变量ch的内容写入文件指针fp所指的文本文件中。,2020/8/23,例1:读取一个给定的文本文件,并将文件的内容显示在屏幕上。,问题分析 需要读取文本文件,所以以“r”操作模式将文件打开。 文本文件的结束标志为EOF。当文件读写指针指向EOF时,表示文件已经读到了尾部。因此,在读文件时,需要设计一个while循环语句,它的结束条件是读取的字符等于EOF。 需要读取的文件名称通过命令行参数带入,这样可以扩展程序的使用范围,增加程序运行的灵活性。,2020/8/23,算法描述,2020/8/23,#include int main( ) FILE *fp; int c

8、h; char name100; printf(“请输入文件名:n”) ; gets(name); fp=fopen(name,r); if(fp= NULL ) /* 打开文件 */ printf(Cannot open file !); return 1; ch = fgetc(fp); /* 以字符方式读取文件 */ while (ch!=EOF) putchar(ch); ch = fgetc(fp); fclose(fp); /* 关闭文件 */ return 0; ,lesson20_01.c,2020/8/23,字符串读写操作 1、fgets( )的调用格式: fgets(,n,

9、); 例如:fgets(str, n, fp); 语句功能是:从fp所指的文件中读出n-1个字符并存入字符数组str中。 2、fputs ( )的调用格式: fputs(,) ; 例如: fputs(“C program”, fp); 语句功能是:将字符串“C program”写入fp所指的文件中。,2020/8/23,例2:编程从键盘输入一个源文件的文件名和一个目的文件的文件名,将源文件的内容拷贝到目的文件中。,2020/8/23,#include int main() FILE *fp1,*fp2; char str20,srcName20,desName20; gets(srcName)

10、;gets(desName); if(fp1=fopen(srcName,r)=NULL) printf(file1 openned error.n); exit(0); if(fp2=fopen(desName,w)=NULL) printf(file2 created error.n); exit(0); while(fgets(str,20,fp1)!= NULL) fputs(str,fp2); fclose(fp1); fclose(fp2); return 0; ,lesson20_02.c,2020/8/23,数据块读写操作 1、 fread( )的调用格式: fread(buf

11、fer, size, count, fp); 例如:fread(buffer, sizeof(int), 5, fp); ; 语句功能是:从fp所指的文件中读取5块数据并放在buffer中,每块数据的大小为int类型占用的字节数量。 2、 fwrite ( )的调用格式: fwrite(buffer, size, count, fp); 例如: fwrite(buffer, sizeof(float), 5, fp) ; 语句功能是:将buffer中存放的数据写入fp所指的文件中,共写入5块数据,每块数据的大小为float类型占用的字节数量。,2020/8/23,例3:从键盘输入学生基本信息,

12、写入二进制文件;再从该文件中读取学生基本信息,并显示输出。,问题分析 假设学生基本信息只包含学号、姓名、所属院系和专业几个数据项,为此,需要定义一个结构类型。输入学生信息的时候,将所有数据项存放在一个结构型变量中,并以二进制的形式写入文件;在读取文件的时候,每次读取一个结构类型变量的字节数目,这样可以很轻松地实现将结构型数据存储到磁盘文件中的操作。,2020/8/23,#include #define NUM 30 typedef struct info /* 表示学生基本信息的结构类型 */ int No; /* 学号 */ char name16; /* 姓名 */ char depart

13、ment32; /* 所属院系 */ char major32; /* 所学专业 */ INFO;,lesson20_03.c,2020/8/23,int main( ) INFO s; int i; FILE *fp; char filename32; printf(nEnter filename:); /* 输入文件名 */ gets(filename); if (fp=fopen(filename, wb) = NULL) /* 以二进制写方式打开文件 */ printf(Cannot open %s file., filename); return 1; ,2020/8/23,for

14、(i=0; iNUM; i+) /* 通过键盘输入学生信息并写入文件 */ scanf(%d%s%s%s, ,2020/8/23,例3:另一种写法,#include #define NUM 3 typedef struct info /* 表示学生基本信息的结构类型 */ int No; /* 学号 */ char name16; /* 姓名 */ char department32; /* 所属院系 */ char major32; /* 所学专业 */ INFO;,2020/8/23,int main( ) INFO s; int i; FILE *fp; char filename32;

15、 printf(nEnter filename:); gets(filename); if (fp=fopen(filename, w) = NULL) printf(Cannot open %s file., filename); return 1; for (i=0; iNUM; i+) scanf(%d%s%s%s, /* 关闭文件 */,2020/8/23,if (fp=fopen(filename, r) = NULL) printf(nCannot open %s file., filename); return 1; for (i=0; iNUM; i+)fscanf(fp,%d

16、%s%s%s, ,2020/8/23,格式化读写操作 1、 fscanf( )的调用格式: fscanf(,); 例如: fscanf(fp, %d%f, 语句功能是:将i、j的内容按照格式控制的描述写入fp所指的文件中。,2020/8/23,例4:从键盘输入一个源文件的名称和一个目的文件的名称,在源文件中存放了一个计算式(注意没有空格). 例如1+2 程序的功能是从源文件中读取该式,并计算其结果,将式子和结果以如下样式输出 1+2=3,2020/8/23,#include int main() FILE *fp1,*fp2; char srcName20,desName20,op; floa

17、t src1,src2,result; printf(请输入源文件名:n); gets(srcName); printf(请输入目的文件名:n); gets(desName); if(fp1=fopen(srcName,r)=NULL) printf(file1 openned error.n); exit(0); if(fp2=fopen(desName,w)=NULL) printf(file2 created error.n); exit(0); fscanf(fp1,%f%c%f,lesson20_04.c,2020/8/23,switch(op) case +: result=src

18、1+src2; break; case -: result=src1-src2; break; case *: result=src1*src2; break; case /: result=src1/src2; fprintf(fp2,%f%c%f=%f,src1,op,src2,result); fclose(fp1); fclose(fp2); return 0; ,2020/8/23,例5:分析程序,#include #define N 5 typedef struct student long sno; char name10; float score3; STU;,lesson20_f.c,2020/8/23,/读第n个学生的信息 void fun(char *filename, STU * n,int index) FILE *fp; fp = fopen(filename, rb); fseek(fp, index*sizeof(STU),SEEK_SET); fread(n, sizeof(STU), 1, fp); fclose(fp); ,2020/8/23,void main()/*修改覆盖最后一个学生数据*/ STU tN= 10001,MaChao, 91, 92, 77, 10002,CaoK

温馨提示

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

评论

0/150

提交评论