第11章 文件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第11章文件浙江工业大学主要内容11.1文件概述11.2文件的打开与关闭11.3文本文件的顺序读写11.4文件定位与文件随机读写简介11.1文件概述11.1.1文件的基本概念11.1文件概述11.1.1文件的基本概念文件是存储在外部介质上的数据的集合。文件的写入和读出文件缓冲区程序数据区11.1文件概述11.1.2文件结构体文件的处理过程一般为:打开文件→读/写文件→关闭文件。文件指针在头文件:stdio.h定义:FILE*文件结构体指针变量名如FILE*fp;11.1文件概述标准设备文件在程序运行时由系统自动打开,在程序终止时自动关闭分类:按数据的存储格式区分,文件可以分为文本文件和二进制文件。例11.1文件操作示例:输入5个学生的姓名、成绩,并顺序写到文件e:\cj.txt中,然后再从文件e:\cj.txt读出并显示所有数据。#includestdio.hvoidmain(){charname[9];inti,score;FILE*fp;fp=fopen(e:\\cj.txt,w);for(i=1;i=5;i++){scanf(%s%d,name,&score);fprintf(fp,%s%d\n,name,score);}fclose(fp);fp=fopen(e:\\cj.txt,r);while(fscanf(fp,%s%d,name,&score)!=EOF)printf(%s,%d\n,name,score);fclose(fp);}11.2文件的打开与关闭11.2.1打开文件函数原型:FILE*fopen(char*filename,char*mode)功能:打开以字符串filename为文件名的文件,函数的返回值为指向该文件的FILE类型结构体变量的首地址,打开文件失败时返回NULL。例如:fp1=fopen(d:\\cj.dat,r)11.2.1打开文件字符串mode中的字符串决定了所打开文件的使用方式mode含义r只读,以只读方式打开已存在的文本文件w只写,以只写方式新建文本文件,若存在同名文件则刷新已有文件a追加,以只写方式打开已存在文本文件,数据追加到文件末尾r+读写,为读/写方式打开已存在的文本文件w+读写,以读/写方式新建文本文件,若存在同名文件则刷新已有文件a+读写,以读/写方式打开已存在文本文件,数据追加到末尾rb只读,以只读方式打开已存在的二进制文件wb只写,以只写方式新建二进制文件,若存在同名文件则刷新已有文件ab追加,以只写方式打开已存在二进制文件,数据追加到末尾rb+读写,为读/写方式打开已存在的二进制文件wb+读写,以读/写方式新建二进制文件,若存在同名文件则刷新已有文件ab+读写,以读/写方式打开已存在二进制文件,数据追加到末尾注意:一般采用以下语句打开文件:if((fp=fopen(d:\\su.dat,w+))==NULL){printf(不能打开文件d:\\su.dat!\n);exit(0);}11.2.2关闭文件函数原型:intfclose(FILE*fp)功能:关闭fp所指向的文件,释放fp所指向的文件结构体和文件缓冲区函数返回非0值表示出错,返回0表示文件已被正常关闭。例如:fclose(fp1)11.3文本文件的顺序读写11.3.1字符读/写(1)字符输入函数fgetc(2)字符输出函数fputc(3)函数feof11.3.2字符串读/写(1)字符串输入函数fgets(2)字符串输出函数fputs11.3.3格式化输入/输出(1)格式化输入函数fscanf(2)格式化输出函数fprintf11.3.1字符读/写(1)字符输入函数fgetc函数原型:intfgetc(FILE*fp)功能:从fp所指向的文本文件的当前读写位置读入一个字符。函数的返回值为该字符的ASCII值,若读到文件结束标志^z则返回EOF(即–1)。注意:从文件读入1个字符后,文件读写位置向后移动1个字节。用法c=fgetc(fp);11.3.1字符读/写(2)字符输出函数fputc函数原型:intfputc(charch,FILE*fp)功能:在fp所指向的文件的当前读写位置写入一个字符。写入字符成功则函数返回值为该字符ASCII值,写入字符不成功则返回值为EOF。注意:向文件写入1个字符后,文件的读写位置指针向后移动1个字节。用法fputc(ch,fp)。11.3.1字符读/写(3)函数feof函数原型:intfeof(FILE*fp)功能:当读到文件末尾时返回非0值,否则返回0。用法:while(!feof(fp)){//当没有到文件结束时,执行...读数据,处理。}例2.编程,将程序运行时输入的若干行字符写入文本文件a.txt中,假定每行字符个数不超过80。然后将文件a.txt中的字符读出、在屏幕显示。#includestdio.hvoidmain(){FILE*p;charc,x[81];inti;p=fopen(a.txt,w);while(gets(x)!=NULL){i=0;while(x[i]!='\0')fputc(x[i++],p);fputc('\n',p);}putchar('\n');fclose(p);p=fopen(a.txt,r);while((c=fgetc(p))!=EOF)putchar(c);fclose(p);}11.3.2字符串读/写(1)字符串输入函数fgets函数原型:char*fgets(char*str,intn,FILE*fp)功能:从fp所指向的文件的当前读写位置起,最多读n–1(包括换行符和文件结束标志,读到它们时终止)个字符,添加后缀’\0’后复制到字符数组str中。操作成功,返回值为str首地址,操作失败,则返回NULL。注意:读入字符串后,读写位置向后移动到该字符串的下一个字符前。11.3.2字符串读/写(2)字符串输出函数fputs函数原型:intfputs(char*str,FILE*fp)功能:向fp所指向的文件写字符串str(不包括串尾标志’\0’),函数的返回值为所输出的最后一个字符的ASCII码,操作不成功则返回值为0。注意:向文件输出字符串后,文件读写位置移动到所写入字符串之后。用法:fputs(str,fp);该函数不会自动在输出字符串到文件时添加’\n’,在需要时,可以加入一条用于换行的语句:“fputc(’\n’,fp);”。例3.编程,将程序运行时输入的若干行字符用函数fputs输出到文本文件a.txt中,假定每行字符个数不超过80。#includestdio.h#includestdlib.hvoiddtos_1(FILE*fp){charc;rewind(fp);while((c=fgetc(fp))!=EOF)putchar(c);}voiddtos_2(FILE*fp,intn){char*str;str=(char*)malloc(n);rewind(fp);while(fgets(str,81,fp)!=NULL)puts(str);free(str);}例3.编程,将程序运行时输入的若干行字符用函数fputs输出到文本文件a.txt中,假定每行字符个数不超过80。voidmain(){FILE*p;charx[81];p=fopen(a.txt,w+);while(gets(x)!=NULL){fputs(x,p);fputc('\n',p);}putchar('\n');dtos_1(p);dtos_2(p,81);fclose(p);}11.3.3格式化输入/输出(1)格式化输入函数函数原型intfscanf(FILE*fp,char*format,地址列表)功能:按照格式控制字符串format所给定的输入格式,把从fp所指向的文件当前读写位置起读入的数据,按地址列表存入指定的存储单元。注意:从文件读入数据后,文件读写位置向后作相应移动。11.3.3格式化输入/输出(2)格式化输出函数函数原型intfprintf(FILE*fp,char*format,输出表)功能:按照格式控制字符串format所给定的输出格式,从fp所指向文件的当前读写位置起,把输出表中各表达式值输出到文件。注意:向文件输出数据后,文件读写位置向后作相应移动。例4.编程,将文本文件e:\aaa.txt中的各行复制到新建文本文件e:\bbb.txt中,其中学号第5、6位为01的不复制,文件e:\aaa.txt中每行数据格式如下。8个字符(姓名)10个字符(学号)3位整数(成绩)回车换行#includestdio.h#includestring.hvoidmain(){FILE*fa,*fb;charname[9],num[11];intcj;fa=fopen(e:\\aaa.txt,r);fb=fopen(e:\\bbb.txt,w);while(fscanf(fa,%8s%10s%3d,name,num,&cj)!=EOF)if(num[4]!='0'||num[5]!='1')fprintf(fb,%8s%10s%3d\n,name,num,cj);fclose(fa);fclose(fb);}例5.编程,将文本文件e:\a.txt中的文本复制到文本文件e:\b.txt中。要求:从文件e:\a.txt中读入的连续若干个空格符中,只写一个空格符到文件e:\b.txt。#includestdio.hvoidmain(){FILE*p1,*p2;charch;intk=0;p1=fopen(e:\\a.txt,r);p2=fopen(e:\\b.txt,w);while((ch=fgetc(p1))!=EOF)if(ch!=''){fputc(ch,p2);k=0;}elseif(k==0){fputc('',p2);k=1;}fclose(p1);fclose(p2);}例6.文件e:\a.txt、e:\b.txt中均从小到大各自存放了若干个实数,编程,将两个文件中所有数据仍按从小到大的顺序写入到文件e:\c.txt。#includestdio.hvoidmain(){floata,b;FILE*fa,*fb,*fc;fa=fopen(e:\\a.txt,r);fb=fopen(e:\\b.txt,r);fc=fopen(e:\\c.txt,w);fscanf(fa,%f,&a);fscanf(fb,%f,&b);doif(ab){fprintf(fc,%f\n,a);fscanf(fa,%f,&a);}else{fprintf(fc,%f\n,b);fscanf(fb,%f,&b);}while(!feof(fa)&&!feof(fb));if(feof(fa))do{fprintf(fc,%f\n,b);fscanf(fb,%f,&b);}while(!feof(fb));elsedo{fprintf(fc,%f\n,a);fscanf(fa,%f,&a);}while(!feof(fa));fclose(fa);fclose(fb);fclose(fc);}例7.文本文件aa.txt中存储若干个学生的信息,包括:学号、三门功课的成绩、平均分(以格式%8s%4d%4d%4d%6.1f\n写入)。编程,键盘输入某学生记录,修改文件aa.txt中的学号与之相同的记录。#includestdio.h#includestring.hstructstu{charnumb[9];ints[3];floatave;};voidmain(){FILE*f1,*f2;stua,b;f1=fopen(aa.txt,r);f2=fopen(bb.txt,w);scanf(%s%d%d%d,a.numb,&a.s[0],&a.s[

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功