C语言文件中数据的访问与存储.ppt
第6章文件中数据的访问与存储,6.1文件的概念和分类 6.2文件中数据的读写步骤6.3文本文件中数据的读写操作,P191,6.1文件的概念和分类,P192,文件是存储在外部介质上数据的集合。存储在磁盘上的文件称为磁盘文件。,6.1文件的概念和分类,P192,按文件的内容分:程序文件和数据文件按文件中数据的组织形式分:文本文件和二进制文件,6.1文件的概念和分类,P192,如果要访问文件中的数据或向文件中存储数据,都要以文件名为标识。仅介绍文本文件中数据的读写方法。,6.2文件中数据的读写步骤,P192,(1)打开文件无论对文件进行读还是写操作,都需要先打开文件,打开文件用fopen函数。(2)读写文件写就是将内存中的数据存到文件中去。主要介绍fscanf和fprintf函数。(3)关闭文件当文件不再使用时,需将其关闭。关闭文件用fclose函数。,向文本文件中写数据从已有的文本文件中读数据文本文件中对数据的读写操作,6.3文本文件中数据的读写操作,P192,向文本文件中写数据,P192,永久性地存放数据,如存储测量数据结果、学生成绩存档等,在C语言中用文件。可以用fprintf函数向文本文件中写数据。,问题的提出,【实例6-1】改写实例1-1。编写程序,将如图1.2所示的问候语写到d盘下c文件夹中的“f1.txt”文件中。,任务与分析,向文本文件中写数据,P192,操作步骤,#include main()定义文件指针fp 打开(或建立)d盘c文件夹中的“f1.txt”文件 将问候语写入“f1.txt”文件 关闭文件,FILE*fp;,fp=fopen(d:cf1.txt,w);,fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);fprintf(fp,n);,fclose(fp);,【实例6-2】编写程序,用人机对话的形式随机产生3道100以内加法题,并将题目和用户输入的答案写到d盘c文件夹中的“f2.txt”文件中。,P194,操作步骤,#include#include#include main()定义整型变量a、b、c和i 定义文件指针fp,int a,b,c,i;FILE*fp;,操作步骤,打开d盘c文件夹中的“f2.txt”文件 随机产生三个题目,fp=fopen(d:cf2.txt,w);if(fp=NULL)printf(Can not open the file.n);exit(0);,srand(time(0);for(i=1;i=3;i+)a=rand()%100;b=rand()%100;,文件打开失败,操作步骤,等待键盘输入答案 将题目和答案存入“f2.txt”文件 关闭文件,fprintf(fp,(%d)%d+%d=%dn,i,a,b,c);,fclose(fp);,printf(第%d题:%d+%d=,i,a,b);scanf(%d,形式接近,【实例6-3】编写程序,将英汉对照表写到当前文件夹中的“f3.txt”文件中。,P195,操作步骤,#include#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;main()定义名为list的结构体类型数组a并初始化 定义循环变量i 定义文件指针fp 打开当前文件夹中的“f3.txt”文件 将结构体数组a中的数据写入“f3.txt”文件 关闭文件,char cn10;char en10;,既清晰又易读取,操作步骤,#include#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;main()定义名为list的结构体类型数组a并初始化 定义循环变量i 定义文件指针fp 打开当前文件夹中的“f3.txt”文件 将结构体数组a中的数据写入“f3.txt”文件 关闭文件,main()struct list a5=中国,China,女孩,girl,男孩,boy,人,man,一,one;int i;FILE*fp;fp=fopen(f3.txt,w);if(fp=NULL)printf(Can not open the file.n);exit(0);for(i=0;i5;i+)fprintf(fp,%15s%15sn,ai.en);fclose(fp);,相对路径,最好提供宽度,【实例6-4】编写程序,向已有的英汉对照表(实例6-3中建立的文件“f3.txt”)最后,添加新的单词。,P197,操作步骤,#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;main()定义名为list的结构体类型变量w 定义文件指针fp 打开当前文件夹中的“f3.txt”文件 输入要添加的单词 将添加的单词写入“f3.txt”文件 关闭文件,char cn10;char en10;,struct list w;FILE*fp;,gets();,gets(w.en);,fprintf(fp,%15s%15sn,w.en);,fp=fopen(f3.txt,a);if(fp=NULL),fclose(fp);,打开文件的一般形式:文件指针名=fopen(文件名,打开方式);,归纳分析,判断文件打开是否成功:if(文件指针名=NULL)printf(Can not open the file.n);exit(0);,归纳分析,关闭文件的一般形式:fclose(文件指针);,fprintf函数的一般形式:fprintf(文件指针名,一串字符);或 fprintf(文件指针名,格式控制字符串,输出项表);,归纳分析,编写程序,从键盘输入3个学生的信息(包括学号,姓名,性别,成绩),并存入d盘c文件夹中的“stu.txt”文件中。,P200,编写程序,向练习6-1中已建立的“stu.txt”文件中添加2个新的学生信息,信息从键盘输入。,6-2,从已有的文本文件中读数据,P200,在日常生活中经常需要访问已有文件中的数据做相应处理,如分析测量数据、统计学生成绩等。在C语言中可以用fscanf函数从文本文件中读取数据。,问题的提出,【实例6-5】编写程序,从实例6-2建立的文件“f2.txt”中读取所有题目和答案,并显示在屏幕上。,任务与分析,从已有的文本文件中读数据,P200,操作步骤,#include#include main()定义整型变量a、b、c、k和i 定义文件指针fp 打开d盘c文件夹中的“f2.txt”文件 从“f2.txt”文件中读取题目和答案 将题目和答案显示在屏幕上 关闭文件,int a,b,c,k,i;FILE*fp;,if(fp=NULL),fp=fopen(d:cf2.txt,r);,for(i=1;i=3;i+)fscanf(fp,(%d)%d+%d=%dn,fclose(fp);,【实例6-6】编写程序,从实例6-3建立的文件“f3.txt”中读取所有内容,并显示在屏幕上。,P201,操作步骤,#include#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;,char cn10;char en10;,操作步骤,main()定义循环变量i 定义名为list的结构体类型变量w 定义文件指针fp 打开d盘c文件夹中的“f3.txt”文件 从“f3.txt”文件中读取单词 将单词显示在屏幕上 关闭文件,int i;struct list w;FILE*fp;,if(fp=NULL),fp=fopen(d:cf3.txt,r);,for(i=1;i=5;i+)fscanf(fp,%15s%15sn,w.en);printf(%15s%15sn,w.en);,fclose(fp);,对于长度不定的文件 while(feof(fp)=0),【实例6-7】编写程序,输入英文或中文单词,根据英汉对照表文件“f3.txt”,在屏幕上显示对应的单词。,P203,操作步骤,#include#include#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;,char cn10;char en10;,操作步骤,main()定义名为list的结构体类型变量w 定义文件指针fp 定义标志变量s.flag 定义字符串变量str 打开d盘c文件夹中的“f3.txt”文件,struct list w;FILE*fp;int s,flag=0;char str20;,fp=fopen(d:cf3.txt,r);if(fp=NULL)printf(Can not open the file.n);exit(0);,操作步骤,选择是英汉还是汉英?输入待查找的单词,printf(请选择:n英汉-1n汉英-2n);scanf(%d,操作步骤,在“f3.txt”文件中查找对应单词 输出查找结果,while(feof(fp)=0)fscanf(fp,%15s%15sn,w.en);if(s=1,操作步骤,关闭文件,fclose(fp);,【实例6-8】用Windows中的记事本建立2个文件“f4.txt”和“f5.txt”,并编写程序,将文件“f5.txt”中的数据合并到“f4.txt”文件中。,P205,操作步骤,用记事本在d盘c文件夹下建立文件“f4.txt”和“f5.txt”,文件中存放汉英对照表。,操作步骤,#include#include struct list 定义存放中文单词的成员 定义存放英文单词的成员;,char cn10;char en10;,操作步骤,main()定义名为list的结构体类型变量w 定义文件指针fp1,fp2 打开d盘c文件夹中的“f4.txt”文件 打开d盘c文件夹中的“f5.txt”文件,struct list w;FILE*fp1,*fp2;fp1=fopen(d:cf4.txt,a);if(fp1=NULL)printf(Can not open the file.n);exit(0);fp2=fopen(d:cf5.txt,r);if(fp2=NULL)printf(Can not open the file.n);exit(0);,操作步骤,从“f5.txt”文件中读取数据 将数据追加到“f4.txt”文件 关闭两个文件,while(feof(fp2)=0)fscanf(fp2,%10s%15sn,w.en);fprintf(fp1,%10s%15sn,w.en);fclose(fp1);fclose(fp2);,fscanf函数的一般形式:fscanf(文件指针名,格式控制字符串,输入项表);,归纳分析,读取文件中所有数据:while(feof(文件指针)=0)读数据,编写程序,输入学号,从练习6-1已建立的“stu.txt”文件中查找对应的学生(若“stu.txt”文件不存在,先建立),并输出该学生的全部信息(包括学号,姓名,性别,成绩)。,P207,P207,用Windows中的记事本建立1个文件“stu1.txt”,文件中存储新入学的学生信息,与“stu.txt”文件格式一致。编写程序,将文件“stu1.txt”中的数据合并到“stu.txt”中。,文本文件中对数据的读写操作,P207,在日常生活中经常需要读取已有文件中的数据进行处理,然后再存入文件中。如对学生成绩排序、考试系统等。在C语言中,需要综合运用函数fscanf、fprintf以及feof等。,问题的提出,【实例6-9】编写程序,从实例6-2建立的文件“f2.txt”中修改第1题的错误答案。,任务与分析,文本文件中对数据的读写操作,P207,操作步骤,#include#include main()定义整型数组a、b、c、k 定义循环控制变量i、j 定义文件指针fp 打开d盘c文件夹中的“f2.txt”文件,int a50,b50,c50,k50,i,j;FILE*fp;fp=fopen(d:cf2.txt,r);if(fp=NULL)printf(Can not open the file.n);exit(0);,操作步骤,从“f2.txt”文件中读取数据到数组a、b、c、k中关闭文件修改第1题答案,i=0;while(feof(fp)=0)fscanf(fp,(%d)%d+%d=%dn,操作步骤,重新打开“f2.txt”文件 将修改后的新数据写入该文件 关闭文件,fp=fopen(d:cf2.txt,w);if(fp=NULL)printf(Can not open the file.n);exit(0);for(j=0;ji;j+)fprintf(fp,(%d)%d+%d=%dn,kj,aj,bj,cj);printf(修改完毕n);fclose(fp)0),【实例6-10】编写程序,将已建立好的文件“f2.txt”中数据全部复制到新文件“f2_new.txt”中。,P209,操作步骤,#include#include main()定义整型变量a、b、c、k 定义文件指针fp1、fp2 打开d盘c文件夹中“f2.txt”、“f2_new.txt”从“f2.txt”文件中读取数据 将数据写入“f2_new.txt”文件中 关闭文件,操作步骤,#include#include main()int a,b,c,k;FILE*fp1,*fp2;fp1=fopen(d:cf2.txt,r);if(fp1=NULL)printf(Can not open the file.n);exit(0);,操作步骤,fp2=fopen(d:cf2_new.txt,w);if(fp2=NULL)printf(Can not open the file.n);exit(0);,操作步骤,while(feof(fp1)=0)fscanf(fp1,(%d)%d+%d=%dn,修改时先以“r”方式打开文件,按顺序读出数据存到临时变量中,处理完后再以“w”方式打开文件,将变量中的数据写到文件中。,归纳分析,每个文件只有一种使用方式,如只读或只写,这种情况下可以设置多个文件指针分别指向各文件。,编写程序,将练习6-1已建立的“stu.txt”文件中(若“stu.txt”文件不存在,先建立)学生姓名“王民”改为“王明”。,P210,编写程序,从练习6-1已建立的“stu.txt”文件中(若“stu.txt”文件不存在,先建立)成绩优秀(成绩85)的学生信息存入新文件“stu_new.txt”中。,P210,