版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章文件系统目录CONTENTS文件概述文件的操作文件的检测与随机读写10.110.210.3综合应用10.4
文件概述10.1文件概述文件类型文件指针文件:存储在外部介质上的相关数据的集合。在本章所讲的文件是由数字和文字组成的数据文件。01文件类型011文件类型按文件编码方式分类⑴ASCII文件(也称文本文件):ASCII文件在磁盘中存放时,每个字符对应一个字节,用于存放对应的ASCII码。如:整型十进制数12345,按ASCII文件存放则需要占用5个字节。可在屏幕上显示,但占用空间较大,读写操作要转换。⑵二进制文件:是对不同的数据类型,按其实际占用内存字节数存放。即内存的存储形式,原样输出到磁盘上存放。如:整型十进制数12345,按二进制文件存放只需要2个字节。屏幕显示为乱码,但占用空间小,读写操作效率高。001100000011100100110000001110010011000100110010001100110011010000110101ASCII文件形式二进制文件形式内存存储形式整数:123451(49)2(50)3(51)4(52)5(53)转换直接011文件类型对文件的处理方式的不同(1)缓冲文件系统(又称标准I/O)是指操作系统在内存中为每一个正在使用的文件开辟一个读写缓冲区。从内存向磁盘输出数据时,必须先送到内存缓冲区,装满缓冲区后才一起送到磁盘去。如果从向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从内存缓冲区逐个地将数据送到程序数据区(变量)。缓冲文件系统解决了高速CPU与低速外存之间的矛盾,使用它延长了外存的使用寿命,也提高了系统的整体效率。(2)非缓冲文件系统(又称系统I/O)是指系统不自动开辟确定大小的内存缓冲区,而由程序自己为每个文件设定缓冲区。文件外存程序数据区输入缓冲区输出缓冲区输入输出输出(写)输入(读)内存缓冲文件系统文件指针02要调用磁盘上的一个文件时,必须知道与该文件有关的信息。比如文件名、文件的当前读写位置、文件缓冲区大小与位置、文件的操作方式等。这些信息被C语言系统保存在一个称作FILE的结构体中,它在stdio.h头文件中定义内。FILE结构体的内容为(在使用文件操作时,一般不用关心FILE内部成员信息):文件指针02文件型指针的数据类型为FILE,它在stdio.h头文件中的定义如下:typedefstruct{intlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/intbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据缓冲区位置*/unsignedchar*curp;/*文件定位指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/}FILE;文件的操作10.2
文件的操作文件的打开和关闭文件的读写操作文件的打开和关闭01文件的打开(fopen()函数)函数原型:FILE*fopen(char*filename,char*mode);说明:(1)若成功,返回指向被打开文件的指针。(2)若出错,返回空指针NULL(0)。(3)filename:这是一个文件指针,对应实参为文件名字的字符串首地址,或用双引号引起来的文件名。此文件名可以带路径名,如“C:\\windows\\xyz.txt”表示打开C盘windows文件夹下的xyz.txt文件。(4)mode为文件的操作方式,如表10-1所示ASCII
文件操作ASCII
文件操作二进制文件操作二进制文件操作只读只读只写追加只写追加读写读写读写读写读写读写rwar+w+a+rbwbabrb+wb+ab+打开一个已经存在的文本文件打开一个已经存在的二进制文件建立并打开一个文本文件打开或建立一个文本文件,在末尾写入建立并打开一个二进制文件打开或建立一个二进制文件,在末尾写入打开一个已经存在的文本文件打开一个已经存在的二进制文件建立并打开一个文本文件打开或建立一个文本文件,在末尾写入建立并打开一个二进制文件打开或建立一个二进制文件,在末尾写入文件的打开和关闭01例FILE*fp1;if(fp1=fopen("C:\\mybook\\bk.txt","r")){printf("Filecannotbeopened!\n");exit(0);
}文件的打开和关闭01这段程序的意义是:如果返回的指针为空,表示不能打开C盘mybook文件夹下的bk.txt文件,并给出提示信息“Filecannotbeopened!”,exit(0)函数的功能是关闭所有打开的文件并强迫程序结束退出。文件的读写操作021.字符读写函数fgetc()和fputc()(1)读字符函数fgetc()函数原型:intfgetc(FILE*fp);说明如下。①fp:文件指针。②若成功,返回输入的字符。③若失败或文件结束,返回EOF。fgetc()函数的功能是从指定的文件中读一个字符。#include<stdio.h>intmain(){FILE*fp;charch;if((fp=fopen("bk.txt","r"))==NULL){printf("Filecannotbeopened");exit(0);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);return0;}例10.1读入文件bk.txt的内容(ILoveChongQing),在屏幕上显示文件的读写操作02文件的读写操作02(2)写字符函数fputc()1.字符读写函数fgetc()和fputc()函数原型:intfputc(intc,FILE*fp);说明如下。①c:要输出到文件的字符。②fp:文件指针。③若成功,返回输出的字符。④若失败或文件结束,返回EOF。fputc()函数的功能是把一个字符写入指定的文件中。#include<stdio.h>intmain(){FILE*fp;charch;if((fp=fopen("bk1.txt","w"))==NULL){printf("Filecannotbeopened!");exit(0);}printf("inputastring:\n");ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}fclose(fp);return0;}例10.2从键盘输入一行字符,写入一个文件文件的读写操作02文件的读写操作022.字符串读写函数fgets()和fputs()(1)读字符串函数fgets()函数原型:char*fgets(char*s,intn,FILE*fp);说明如下。①从fp输入字符串到s中,输入n-1个字符,直到遇到换行符或EOF为止,读完后自动在字符串末尾添加'\0'。②若成功,返回s首地址。③若失败,返回NULL。fgets()函数的功能是从指定的文件中读一个字符串到字符数组中。#include<stdio.h>intmain(){FILE*fp;charstring[100];if((fp=fopen("bk.txt","rt"))==NULL){printf("Filecannotbeopened!");exit(0);}fgets(string,100,fp);printf("%s",string);fclose(fp);return0;}例10.3从bk.txt文件中,读入一个不大于99个字符的字符串。文件的读写操作02文件的读写操作022.字符串读写函数fgets()和fputs()(2)写字符串函数fputs()函数原型:intfputs(char*s,FILE*fp);说明如下。①字符串的结束标志'\0'不会输出到文件,也不会在字符串末尾自动添加换行符。②若成功,返回输出字符个数(或最后的字符)。③若失败,返回EOF。fputs()函数的功能是向指定的文件写入一个字符串。#include<stdio.h>intmain(){FILE*fp;charch,string[20];if((fp=fopen("bk.txt","at+"))==NULL){printf("Filecannotbeopened!");exit(0);}printf("inputastring:\n");scanf("%s",string);fputs(string,fp);fclose(fp);return0;}例10.4在文件bk.txt中追加一个字符串。文件的读写操作02#include<stdio.h>intmain(){FILE*fp;charch;if((fp=fopen("bk1.txt","w"))==NULL){printf("Filecannotbeopened!");exit(0);}printf("inputastring:\n");ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}fclose(fp);return0;}例:从键盘输入一行字符,写入一个文件文件的读写操作02文件的读写操作023.数据块读写函数fread()和fwrite()函数原型:size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp);size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp);说明如下。(1)buffer:要读/写的数据块地址。(2)size:要读/写的每个数据项的字节数。(3)count:要读/写的数据项数量。(4)fp:文件指针。(5)若成功,返回实际读/写的数据项数量。(6)若失败,一般返回0。#include<stdio.h>structstudent{charname[12];intnum;}stu1[2],stu2[2],*p,*q;intmain(){FILE*fp;charch;inti;p=stu1;q=stu2;if((fp=fopen("boy","w"))==NULL){printf("Filecannotbeopened!");exit(0);}printf("\ninputdata\n");例10.5从键盘输入两个学生数据,写入一个文件中,再读出这些数据显示在屏幕上。文件的读写操作02for(i=0;i<2;i++,p++)scanf("%s%d",p->name,&p->num);p=stu1;fwrite(p,sizeof(structstudent),2,fp);fclose(fp);if((fp=fopen("boy","r"))==NULL){printf("Filecannotbeopened!");exit(0);}fread(q,sizeof(structstudent),2,fp);printf("\n\nname\tnumber\n");for(i=0;i<2;i++,q++)printf("%s\t%5d\n",q->name,q->num);fclose(fp);return0;}文件的读写操作024.格式化读写函数fscanf()和fprintf()函数原型:intfscanf(FILE*fp,char*format[,address,…]);intfprintf(FILE*fp,char*format[,argument,…]);说明如下。(1)fscanf()函数和fprintf()函数与前面使用的scanf()和printf()函数的功能相似,都是格式化读写函数。两者的区别在于fscanf()函数和fprintf()函数的读写对象不是键盘和显示器,而是磁盘文件。(2)这两个函数从文件输入或输出到文件。#include"stdio.h" intmain() { FILE*fp; inti; charstring[10]; //姓名字符串intage; //年龄floataverage; //平均成绩if((fp=fopen("book.txt","w"))==NULL) {printf("Cannotopenfile!\n"); exit(0);} printf("string:"); scanf("%s",&string); printf("age,average:"); scanf("%d%f",&age,&average); while(strlen(string)>1){ fprintf(fp,"%s%d%f",string,age,average); printf("string,age,average:"); scanf("%s%d%f",string,&age,&average);} fclose(fp); return0; } 例10.6格式化读写文件。文件的读写操作02文件的检测与随机读写10.3
文件的检测与随机读写文件的检测文件的随机读写文件的检测011.文件结束检测函数feof()函数原型:intfeof(FILE*fp);说明如下。(1)判断文件是否处于文件结束位置。(2)如文件结束,则返回值为1,否则为0。例如,读入一个文件直到文件尾的程序:while(!feof(fp))ch=getc(fp);2.读写文件出错检测函数ferror()函数原型:intferror(FILE*fp);说明如下。(1)检查文件在用各种输入/输出函数进行读写时是否出错。(2)ferror()返回值为0表示未出错,否则表示有错。应该注意,对同一个文件每一次调用输入/输出函数,均产生一个新的ferror()函数值,因此,应当在调用一个输入/输出函数后立即检查ferror()函数的值,否则信息会丢失。在执行fopen()函数时,ferror()函数的初值自动置0。文件的检测01文件的检测013.文件出错标志和文件结束标志置0函数clearerr()函数原型:intclearerr(FILE*fp);说明如下。(1)清除出错标志和文件结束标志,使它们为0。(2)如在调用一个输入/输出函数时出现错误,ferror()函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变成0。(3)只要出现错误标志就一直保留,直到对同一文件调用clearerr()函数或其他任何一个输入/输出函数。文件的随机读写021.重新定位函数rewind()函数原型:voidrewind(FILE*fp);说明如下。(1)fp:文件指针。(2)使文件位置指针重新返回文件开头,无返回值。它的功能是把文件内部的位置指针移到文件头。不管当前文件的位置指针在何处,都强行让该指针指向文件头。文件的随机读写022.得到当前文件内部位置函数ftell()函数原型:longftell(FILE*fp);说明如下。(1)fp:文件指针。(2)得到文件中的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,人们往往不容易知道其当前位置,用ftell()函数可以得到当前位置,如果ftell()函数返回值为-IL,表示出错。例如:i=ftell(fp);if(i==-1L)printf("error");变量i存放指针当前位置,若调用函数出错(如不存在此文件),则输出“error”。文件的随机读写02函数原型:intfseek(FILE*fp,longoffset,intwhence);
说明如下。(1)fp:文件指针。(2)offset:偏移量。(3)whence:起始位置。函数的功能是可以随机改变文件的位置指针。“文件指针”指向被移动的文件。“偏移量”表示移动的字节数,要求位移量是long型数据。当用常量表示位移量时,要求加后缀“L”。“起始位置”表示开始计算位移量的起点,有三种表示方式:文件开始、当前位置和文件末尾。3.移动文件内部位置函数fseek()文件起始位置表示方式文件的读写操作02起始点表示符号表示数字文件开始SEEK_SET0文件当前位置SEEK_CUR1文件末尾SEEK_END2举例:fseek(fp,10L,SEEK_SET);fseek(fp,-100L,1);fseek(fp,-28L,2);fseek(fp,10L,SEEK_SET); /*其意义是把位置指针移到离文件开始位置10个字节处*/fseek(fp,-100L,1); /*其意义是把位置指针从当前位置向文件头移动100个字节*/fseek(fp,-28L,2); /*其意义是把位置指针从文件尾向文件头移动28个字节*/综合应用10.4
#include<stdio.h>structstudent{charname[10];charaddr[20];}stu,*q;intmain(){FILE*fp;charch;inti=1;q=&stu;if((fp=fopen("student.txt","r"))==NULL){printf("Filecannotbeopened!");exit(0);}rewind(fp);fseek(fp,i*sizeof(structstudent),0);fread(q,sizeof(structstudent),1,fp);printf("\n\nname\taddr\n");printf("%s\t%s\n",q->name,q->addr);return0;}例10.7在学生文件student.txt中读出第二个学生的数据。综合应用综合应用(1)建立一个含有30个学生成绩的文件file1.txt,每个学生的数据包括:姓名、学号以及语文、数学、外语三门课的成绩。(2)求每个学生的总分和平均分,文件名为file2.txt。(3)对file2.txt按总分排序,结果存入文件file3.txt。例10.8综合应用举例#include"stdio.h" #include"string.h" structstu1 { charname[10];/*姓名*/charnum[10];/*学号*/
intscore[3];/*三门课成绩*/}s1[30]; structstu2 { charname[10]; charnum[10]; intscore[3]; inttotal; /*总分*/floataverage; /*平均分*/}s2[30];综合应用续综合应用voidinputfile1() {FILE*f; inti; f=fopen("file1.txt","w"); for(i=0;i<30;i++) {scanf("%s%s%d%d%d",s1[i].name,s1[i].num, &s1[i].score[0],&s1[i].score[1],&s1[i].score[2]); if(fwrite(&s1[i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025南平市消防救援支队招聘消防文员2人考试备考题库及答案解析
- 职场拔河比赛活动方案
- 2026年恢复林业生产条件方案范文
- 南昌市劳动保障事务代理中心招聘6名项目外包服务人员备考考试试题及答案解析
- 深度解析(2026)《GBT 25898-2010深度解析(2026)《仪器化纳米压入试验方法 薄膜的压入硬度和弹性模量》》
- 2025青海物产爆破技术服务有限公司招聘31人备考笔试题库及答案解析
- 深度解析(2026)《GBT 25799-2010纺织染整助剂名词术语》(2026年)深度解析
- 2025重庆科技大学招聘14人备考考试试题及答案解析
- 深度解析(2026)GBT 25690-2010土方机械 升运式铲运机 容量标定
- 深度解析(2026)《GBT 25654-2010手持电子产品嵌入式软件API》
- 手卫生执行率PDCA案例实施分析
- 病理学考试练习题库及答案
- 2025年新高考1卷(新课标Ⅰ卷)语文试卷
- 2025-2030中国女鞋行业市场现状供需分析及投资评估规划分析研究报告
- 2025至2030中国物理气相沉积(PVD)设备行业行情监测与发展动向追踪报告
- 2025年中国EP级蓖麻油行业市场前景预测及投资价值评估分析报告
- 散酒采购合同协议
- 工控网管理制度
- 大学英语四级考试2024年12月真题(第一套)Part II Listening Comprehension
- 测量年终工作总结
- 第1课“北京双奥”荣耀中华 课件 2024-2025学年人教版(2024)初中体育与健康七年级全一册
评论
0/150
提交评论