




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
存储设备第九章数据的永久性存储内部存储设备外部部存储设备9.1数据的永久性存储文件是永久性存储设备的最基本存储单位。文件能够大量的、永久性的保存数据信息,并能够通过各种文件操作功能来管理和使用这些数据。文件概念:文件是指存储在永久性存储设备上的具有名字(文件名)的一组相关数据的集合,通常也被称为磁盘文件。9.2文件的组织方式根据编码方式,文件可以分为两种:一种是文本文件(ASCII码文件),另一种是二进制文件。通过C语言编程实现对文件的访问时,必须要严格按照文件原有的编码方式及文件存储格式来对文件进行访问操作,才能正确读写文件数据。9.3文件的操作头文件stdio.h定义了文件结构体类型FILE,用来保存文件的文件名、文件的状态和文件当前的读写位置等相关文件信息。9.3.1stdio.htypedef
struct
{
short level; /*缓冲区‘满’或‘空’的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsignedchar hold; /*如无缓冲区不读字符*/
short bsize; /*缓冲区的大小*/
unsignedchar *buffer; /*数据缓冲区的位置*/
unsignedchar *curp; /*文件内位置指针当前的指向*/
unsigned istemp; /*临时文件指示器*/
short token; /*用于有效性检查*/}FILE;9.3文件的操作C语言的文件操作编程时,用FILE来定义一个文件结构体类型指针变量(通常称为文件指针),用来指向被访问的文件并通过该文件指针变量来访问文件信息。文件指针定义形式:9.3.1stdio.hFILE*fp; /*定义文件结构体类型指针变量*/上面的C程序语句定义了一个文件指针fp,但fp指向哪个文件,目前并不知道,只有通过文件打开函数让fp指向某个指定文件,将fp与该文件关联起来,才能使用fp。9.3文件的操作C语言是以文件流的形式来对文件进行访问操作的。为了便于对文件流的顺序访问和随机定位访问,在文件内部还有一个位置指针来指向文件的当前读写操作位置,这就是文件结构体FILE中的成员指针变量curp。9.3.1stdio.h9.3文件的操作stdio.h中关于文件的宏定义9.3.1stdio.h#defineSEEK_SET 0 /*表征文件头位置*/#defineSEEK_CUR 1 /*表征文件位置指针当前所处位置*/#defineSEEK_END 2 /*表征文件尾位置*/#defineEOF
-1/*文件结束标识宏常量*/9.3文件的操作stdio.h中关于文件的常用函数9.3.1stdio.h函数名功能说明函数名功能说明fopen()打开文件流fscanf()从文件流中按格式读取数据fclose()关闭文件流fprintf()把数据按格式输出到文件流feof()文件结束标识测试fread()从文件流中读取指定大小的数据块ferror()文件访问错误测试fwrite()向文件流中写入指定大小的数据块fgetc()从文件流中读取(输入)一个字符rewind()文件内部读写位置指针复位到文件头fputc()写入(输出)一个字符到文件流中fseek()文件内部读写位置指针置为特定位置fgets()从文件流中读一行或指定长度字符串ftell()返回文件内部读写位置指针当前位置fputs()写字符串到文件流中9.3文件的操作9.3.2文件的打开与关闭(1)文件打开函数fopen()原型:FILE*fopen(constchar*filename,constchar*mode);头文件:#include<stdio.h>功能:以指定方式打开所指定的文件参数:filename—文件路径加文件名,mode—文件打开方式返回值:若打开文件成功,则返回文件指针值;否则,返回NULL(2)文件关闭函数fclose()原型:int
fclose(FILE*stream);头文件:#include<stdio.h>功能:关闭文件参数:stream—文件指针返回值:若关闭文件成功,则返回0;否则,返回EOF9.3文件的操作9.3.2文件的打开与关闭……FILE*fp,*fpBinary;fp=fopen(“c:\\zwg\\zwg.txt","r"); /*以只读方式打开文本文件*/if(NULL==fp){
printf("Opentextfile'zwg.txt'error!");
exit(-1);}fpBinary=fopen(“c:\\zwg\\zwg.bin","rb+");/*以读/写方式打开二进制文件*/if(NULL==fpBinary){
printf("Openbinaryfile'zwg.bin'error!");
exit(-1);}…… /*此处可放置若干文件操作代码*/fclose(fp);
/*关闭文件指针fp所指向的文件*/fclose(fpBinary);
/*关闭文件指针fpBinary所指向的文件*/……
9.3文件的操作9.3.2文件的打开与关闭关于文件的打开方式文本文件二进制文件rrbwwbaabr+rb+或r+bw+wb+或w+ba+ab+或a+b9.3文件的操作9.3.3文件读/写函数及与读写相关的函数文件结束标识测试函数feof()文件操作错误测试函数ferror()字符读/写函数fgetc()和fputc()字符串读/写函数fgets()和fputs()格式化读/写函数fscanf()和fprintf()数据块读/写函数fread()和fwrite()9.3文件的操作9.3.3文件读/写函数及与读写相关的函数文件结束标识测试函数feof()原型:int
feof(FILE*stream);头文件:#include<stdio.h>功能:文件结束标识符测试参数:stream—文件指针返回值:若文件内部读写位置指针正指向文件尾,则返回非0值;否则,返回0值if(!feof(fp)) /*如果没有遇到文件尾则执行操作*/{ …… /*文件读写操作代码*/}9.3文件的操作9.3.3文件读/写函数及与读写相关的函数文件操作错误测试函数ferror()原型:int
ferror(FILE*stream);头文件:#include<stdio.h>功能:文件操作错误测试参数:stream—文件指针返回值:若出现错误,则返回非0值;否则,返回0值if(ferror(fp))
/*如果文件读或写出错*/{
……
/*文件读写错误处理程序代码*/}9.3文件的操作9.3.3文件读/写函数及与读写相关的函数字符读/写函数fgetc()和fputc()原型:int
fgetc(FILE*stream);头文件:#include<stdio.h>功能:从文件中读入一个字符参数:stream—文件指针返回值:成功执行则返回所读取字符(字节)的整数值;否则,返回EOF原型:int
fputc(intch,FILE*stream);头文件:#include<stdio.h>功能:把字符ch写入到文件中参数:ch—字符,stream—文件指针返回值:成功执行则返回所写入字符的整数值;否则,返回EOFch=fgetc(fp);/*从fp所指向的文件流读取一个字符,并赋给字符变量ch*/fputc(ch,fp); /*把字符ch写入到文件中*/9.3文件的操作9.3.3文件读/写函数及与读写相关的函数字符串读/写函数fgets()和fputs()原型:char*fgets(char*s,intn,FILE*stream);头文件:#include<stdio.h>功能:从文件中读入一个长度为n-1的字符串参数:s—字符串,n—要读入的字符串总长度(空字符计算在内),stream—文件指针返回值:返回字符指针s的值原型:int
fputs(char*s,FILE*stream);头文件:#include<stdio.h>功能:把字符串s写入到文件中参数:s—字符串,stream—文件指针返回值:成功执行则返回一个非负整数值;否则,返回EOF9.3文件的操作9.3.3文件读/写函数及与读写相关的函数格式化读/写函数fscanf()和fprintf()原型:int
fscanf(FILE*stream,const
char*format,…);头文件:#include<stdio.h>功能:文件格式化读取参数:stream—文件指针,format—格式控制字符串,…—可变数目变量列表返回值:成功执行则返回所读取的字节数;否则,返回EOF原型:int
fprintf(FILE*stream,const
char*format,…);头文件:#include<stdio.h>功能:文件格式化输出参数:stream—文件指针,format—格式控制字符串,…—可变数目变量列表返回值:成功执行则返回所写入的字节数;否则,返回一负数值9.3文件的操作9.3.3文件读/写函数及与读写相关的函数数据块读/写函数fread()和fwrite()原型:size_t
fread(void*buffer,size_tsize,size_tcount,FILE*stream);头文件:#include<stdio.h>功能:读取文件数据块参数:buffer—数据存储区指针,size—数据项字节数,count—数据项数,stream—文件指针返回值:返回实际读取的数据项数原型:size_t
fwrite(void*buffer,size_tsize,size_tcount,FILE*stream);头文件:#include<stdio.h>功能:写数据块到文件中参数:buffer—数据存储区指针,size—数据项字节数,count—数据项数,stream—文件指针返回值:成功执行,则返回值等于count;若返回值小于count,则说明写数据库出错9.3文件的操作9.3.3文件读/写函数及与读写相关的函数例9-1编程实现把文本文件hit.txt另存为新文本文件hit_new.txt。#include<stdio.h>#include<stdlib.h>void
main(void){
FILE*fp,*fpNew;
intnCh,nResult; fp=fopen("hit.txt","r"); /*以只读方式打开文件hit.txt*/
if(NULL==fp) {
printf("Openfilehit.txterror\n");
exit(-1); } fpNew=fopen("hit_new.txt","w"); /*创建hit_new.txt并以只写方式打开*/
if(NULL==fpNew) {
printf("Createfilehit_new.txterror\n");
exit(-1); }
while(!feof(fp)) /*未遇到文件尾时循环读写操作*/ { nCh=fgetc(fp); /*从文件hit.txt读取字符*/
if(EOF!=nCh) { nResult=fputc(nCh,fpNew);/*把字符写到文件hit_new.txt中*/ if(EOF==nResult) {
printf("Writecharactertohit_new.txterror\n");
exit(-1); }
putchar(nCh); } }
fclose(fp);
fclose(fpNew);
printf("\nFilesaveassuccessfully!\n");}9.3文件的操作9.3.3文件读/写函数及与读写相关的函数例9-2把从键盘输入的一个字符串写到文件hit.txt中,再从文件中把该字符串读出来显示到屏幕上。#include<stdio.h>#include<stdlib.h>#include<string.h>void
main(void){
FILE*fp;
charstr[81],strNew[81],*pCh;
intnResult,nLen;
fp=fopen("hit.txt","w+"); /*创建文件hit.txt并打开*/
if(NULL==fp) {
printf("Openfilehit.txterror\n");
exit(-1); }
gets(str); /*获取键盘输入字符串*/ nLen=strlen(str); /*计算字符串长度*/ nResult=fputs(str,fp); /*把字符串写入文件中*/
if(EOF==nResult) {
printf("Writestringtohit.txterror\n");
exit(-1); }
printf("Writestringtofilecompletely\n");
fclose(fp);
fp=fopen("hit.txt","r"); /*以只读方式重新打开hit.txt*/
if(NULL==fp) {
printf("Openfilehit.txterror\n");
exit(-1); } pCh=fgets(strNew,nLen+1,fp); /*从文件中读取字符串*/
if(NULL==pCh) {
printf("Readstringfromhit.txterror\n");
exit(-1); }
puts(pCh); /*输出字符串到屏幕,此处也可把pCh替换成strNew*/
fclose(fp);}9.3文件的操作9.3.3文件读/写函数及与读写相关的函数例9-3从键盘分别输入整数、浮点数、字符、字符串各一个,要求把这些数据按照键盘输入时的格式写到文件hit.txt中,然后从文件中把这些数据按原有格式读入并显示到屏幕上。#include<stdio.h>#include<stdlib.h>#include<string.h>void
main(void){
FILE*fp;
int nNum,nResult;
floatfData;
charch,str[30];
printf("Pleaseinputaninteger,afloat,acharandastringlikethis:\n");
printf("2008,8.08,B,Olympic\n\n");
scanf("%d,%f,%c,%s",&nNum,&fData,&ch,str);/*从键盘格式化输入数据*/ fp=fopen("hit.txt","w+"); /*新建文本文件*/
if(NULL==fp){
printf("Openfilehit.txterror\n");
exit(-1); }
nResult=fprintf(fp,"%d,%.2f,%c,%s",nNum,fData,ch,str);/*格式化写入文件*/
if(nResult<0) {
printf("Writeformatteddatatohit.txterror\n");
exit(-1); }
printf("Writeformatteddatatofilecompletely\n"); nNum=0; /*清空各变量*/ fData=0.0; ch='\0';
strcpy(str,"");
fseek(fp,0L,SEEK_SET); /*把文件内部读写位置指针重新定位到文件头*/
nResult=fscanf(fp,"%d,%f,%c,%s",&nNum,&fData,&ch,str);/*从文件格式化读入数据*/
if(EOF==nResult) {
printf("Readformatteddatafromhit.txterror\n");
exit(-1); }
printf("%d,%.2f,%c,%s\n",nNum,fData,ch,str);
fclose(fp);}9.3文件的操作9.3.3文件读/写函数及与读写相关的函数例9-4现有内容为“The2008BeijingOlympicGamesweretrulyexceptionalGames!”(共60个字符,包括空格字符在内)的文本文件hit.txt,将其加密成一个二进制文件hit.bin。加密算法是把从文件中读出的所有字符按其在文件中的排列顺序依次加上数值0~59。#include<stdio.h>void
main(void){
FILE*stream;
charlist[80];
inti,NumRead,NumWritten;
if((stream=fopen("hit.txt","r"))!=NULL) /*打开文件*/ { NumRead=fread(list,sizeof(char),60,stream); /*从文件中读取60个字符*/
printf("Numberofitemsread=%d\n",NumRead);/*输出所读取的字符数*/
printf("Contentsofbuffer=%.60s\n",list); /*输出所读取的字符块*/
fclose(stream); }
else
printf("Filecouldnotbeopened\n");
if((stream=fopen("hit.bin","wb"))!=NULL) /*创建新的二进制文件*/ { for(i=0;i<60;i++) list[i]=(char)(list[i]+i); /*通过字符运算进行简单加密*/ NumWritten=fwrite(list,sizeof(char),60,stream);/*把加密后的字符块写入文件中*/
printf("Wrote%ditems\n",NumWritten); /*输出已写入文件的字符数*/
fclose(stream); }
else
printf("Filecouldnotbeopened\n");}9.3文件的操作9.3.4文件定位函数函数rewind()函数fseek()函数ftell()9.3文件的操作9.3.4文件定位函数函数rewind()原型:void
rewind(FILE*stream);头文件:#include<stdio.h>功能:把文件内部读写位置指针无条件的重新指向文件头位置参数:stream—文件指针返回值:无返回值9.3文件的操作9.3.4文件定位函数函数fseek()原型:int
fseek(FILE*stream,longintoffset,intwhence);头文件:#include<stdio.h>功能:文件内部读写位置指针置为指向一个特定的位置,该位置由函数的调用参数来决定参数:stream—文件指针,offset—偏移量,whence—文件内部预定义位置返回值:成功执行则返回0;否则返回非0值9.3文件的操作9.3.4文件定位函数函数ftell()原型:longint
ftell(FILE*stream);头文件:#include<stdio.h>功能:返回文件内部读写位置指针当前指向位置参数:stream—文件指针返回值:成功执行则返回当前位置距离文件头的偏移量(字节数);否则返回-1L9.3文件的操作9.3.4文件定位函数例9-5计算一个二进制文件的大小(所占字节数),并在屏幕上显示出来。#include<stdio.h>void
main(void){
FILE*stream;
longintlnFileSize;
if((stream=fopen("hit.bin","rb"))!=NULL) {
fseek(stream,0L,SEEK_END);/*文件内部读写位置指针指向文件尾*/ lnFileSize=ftell(stream);/*求文件尾到文件头的偏移量即文件大小*/
printf("Thefilesizeofhit.binis%ldbytes\n",lnFileSize);
fclose(stream); }
else
printf("Filecouldnotbeopened\n");}9.4综合应用实例例9-6给学生管理系统添加文件操作功能,包括从文件中读取学生信息记录及保存中间操作结果到文件中。/*定义学生信息结构体类型*/typedef
structstudent{
intid; /*学号*/
floatcLanguage,math,english;/*C语言、数学和英语成绩*/
charname[20]; /*学生姓名*/}STUDENT; /*学生信息结构体数据类型别名*/原型:int
ReadStuInfo(char*filename,char*mode,STUDENT*stu,intnum);功能:从文件中读取学生成绩信息参数:filename—文件名,mode—文件打开方式,stu—学生结构体数组,num—记录数返回值:执行成功则返回实际读入的记录数,否则返回-1原型:int
WriteStuInfo(char*filename,char*mode,STUDENT*stu,intnum);功能:把学生成绩信息写入到文件中参数:filename—文件名,mode—文件打开方式,stu—学生结构体数组,num—记录数返回值:执行成功则返回实际写入的记录数,否则返回-1(1)读取学生信息的子函数ReadStuInfo() (2)把中间操作结果写入到文件中的子函数WriteStuInfo()int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物医疗技术投资与支持合同
- 服务专卖店劳动合同书
- 企业宽带租赁合同
- 专利技术咨询合同
- 建设工程居间费合同
- 股权对外转让合同
- 消防通风承包合同
- 汽车销售维修服务合同
- 04 8 列夫·托尔斯泰2024-2025学年八年级语文上册同步教学设计(河北专版)
- 甘肃畜牧工程职业技术学院《工程测试技术》2023-2024学年第二学期期末试卷
- 2022年中级注册安全工程师(安全生产法及相关法律知识)考试题库模考300题及答案下载(四川省专用)
- 《未成年人保护法》课件
- 原发性肝癌经皮肝动脉化疗栓塞术(TACE)临床路径
- 成品检验部在线抽检记录表
- 全国水资源综合规划技术细则(水利部文件)
- 司法拘留申请书3篇
- 2022年《国民经济行业分类》
- 2第二章 保护煤柱的设计
- 标准化炸药库建设方案
- 新华书店物流中心的规划
- 各岗位说明书汇总1
评论
0/150
提交评论