c语言程序设计 文件程序设计_第1页
c语言程序设计 文件程序设计_第2页
c语言程序设计 文件程序设计_第3页
c语言程序设计 文件程序设计_第4页
c语言程序设计 文件程序设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第9章文献程序设计

《C语言程序设计》(第3版)张磊编著21世纪高等学校规划教材清华大学出版社语言程序设计(第3版)张磊编著清华大学出版社第1页第9章文献程序设计9.1文献概述9.2文献基本操作9.3文献数据块读写操作9.4文献其他操作9.5文献应用举例语言程序设计(第3版)张磊编著清华大学出版社第2页9.1文献概述9.1.1文献概念9.1.2文献分类9.1.3文献一般操作过程9.1.4文献指针语言程序设计(第3版)张磊编著清华大学出版社第3页9.1.1文献概念文献是计算机中一种主要概念,一般是指存放在外部介质上信息集合。存放程序代码文献称为程序文献,存放数据文献称为数据文献。另外,C语言把输入输出设备也视为一类特殊文献。计算机对文献操作总体上提成输入和输出两大类,对文献输人输出(I/0)过程是通过操作系统进行管理。C语言程序对文献处理是通过标准函数库中文献操作函数实现,使用这些函数,能够简单、高效、安全地访问外部数据。语言程序设计(第3版)张磊编著清华大学出版社第4页9.1.1文献概念1.设备文献在C语言中,所有外部设备均被作为文献看待,这种文献称为设备文献。对外部设备输人输出处理就是读写设备文献过程。

2.文献缓冲区在程序运行过程中,程序要将保存在内存中数据写入磁盘,首先要建立一种“输出文献缓冲区”,这个缓冲区是一种连接计算机内存数据与外存文献桥梁,当向文献输出数据时,准备输出数据先写入文献缓冲区,等文献缓冲区填满后再输出到文献中。这一过程称为“写文献”,是数据输出过程。与“写文献”过程相正确是要将保存在文献中数据装入内存。首先要建立一种“输入文献缓冲区”,当从文献中输入数据时,也是把读入数据先写入文献缓冲区,等文献缓冲区数据装满之后再整个送给程序。这一过程称为“读文献”,是数据输入过程。语言程序设计(第3版)张磊编著清华大学出版社第5页9.1.1文献概念使用缓冲区文献读、写示意图

语言程序设计(第3版)张磊编著清华大学出版社第6页9.1.2文献分类以ASCII码字符形式存放文献称为文本文献,又叫ASCII文献。例如用高级程序语言编写程序文献是文本文献,用Windows“记事本”程序创建文献也是文本文献。文本文献是一种字符流文献,文本文献一种字符就是一种字节,因而方便了字符处理,不过文本文献一般要占用较大存放空间。二进制文献是按照数据在内存中字节序列形成字节流文献。例如C程序目标文献(扩展名为obj)和可执行文献(扩展名为exe)都是二进制文献。在二进制文献中,字节信息与实际数据位并不一一对应,因此,若直接显示二进制文献内容时,顾客看到是某些不能识别字符。

文本文献

二进制文献语言程序设计(第3版)张磊编著清华大学出版社第7页9.1.3文献一般操作过程使用文献一般步骤打开文献→操作文献→关闭文献打开文献:建立顾客程序与文献联系,系统为文献开辟文献缓冲区。操作文献:是指对文献读、写、追加和定位操作。读操作:从文献中读出数据,即将文献中数据输入到计算机内存。写操作:向文献中写入数据,即将计算机内存中数据输出到文献。追加操作:将新数据写到文献原有数据背面。定位操作:移动文献读写位置指针。关闭文献:切断文献与程序联系,将文献缓冲区内容写入磁盘,并释放文献缓冲区。语言程序设计(第3版)张磊编著清华大学出版社第8页9.1.4文献指针文献型指针变量定义FILE*变量名;例如:FILE*p;注意:由于文献类型FILE在头文献stdio.h中定义,因此在使用FILE类型前必须先打开stdio.h文献。假如需要对某一种文献进行读写操作,必须首先要指定指向它文献指针。只有通过文献指针,才能调用对应文献。当程序需要同步处理多种文献时,则需要说明多种FILE型指针变量,使它们分别指向多种不一样文献。语言程序设计(第3版)张磊编著清华大学出版社第9页9.2文献基本操作9.2.1打开和关闭文献9.2.2最基本文献读写函数语言程序设计(第3版)张磊编著清华大学出版社第10页9.2.1打开和关闭文献打开文献操作是使用文献第一种步骤,而关闭文献操作则是使用文献最后一种步骤。C语言系统分别使用fopen()函数和fclose()函数实现文献打开和关闭操作。1.文献打开函数fopen()fopen()函数用来实现打开文献,它处理如下3个问题:⑴指定要打开文献名;⑵指定文献使用方式,如是读文献还是写文献等;⑶为打开文献指定一种指针变量,方便使用这个指针变量对文献进行访问。fopen()函数调用方式FILE*fp;fp=fopen(文献名,使用文献方式);例如:fp=("example.txt","r");表达要打开文献名为example.txt,使用文献方式是“r”方式,文献指针是fp。语言程序设计(第3版)张磊编著清华大学出版社第11页9.2.1打开和关闭文献文献使用方式文献使用方式作用r以“只读”方式打开一种文本文献w以“只写”方式打开一种文本文献a向文本文献尾增加数据rb以“只读”方式打开一种二进制文献wb以“只写”方式打开一种二进制文献ab向二进制文献尾增加数据r+以“读/写”方式打开一种文本文献w+以“读/写”方式建立一种新文本文献a+以“读/写/追加”方式打开一种文本文献rb+以“读/写”方式打开一种二进制文献wb+以“读/写”方式建立一种新二进制文献ab+以“读/写/追加”方式打开一种二进制文献语言程序设计(第3版)张磊编著清华大学出版社第12页9.2.1打开和关闭文献2.关闭文献函数fclose()fclose()函数一般格式fclose(文献指针);功能关闭“文献指针”所指向文献,释放打开文献时使用构造体变量,断开文献指针与文献联系。例如:

fclose(fp);语言程序设计(第3版)张磊编著清华大学出版社第13页9.2.2最基本文献读写函数1.fputc()函数一般形式fputc(ch,fp);功能将字符(ch值)输出到fp所指向文献中。语言程序设计(第3版)张磊编著清华大学出版社第14页9.2.2最基本文献读写函数例9-1使用fputc()函数在屏幕显示一种字符串。/*programe9-1.c*/

#include<stdio.h>voidmain(){char*p="Thisisaexample.";while(*p!='\0')fputc(*p++,stdout);}设备文献语言程序设计(第3版)张磊编著清华大学出版社第15页9.2.2最基本文献读写函数例9-2

把从键盘输入一种字符串写入到磁盘文献example.txt中。/*programe9-2.c*/#include<stdio.h>voidmain(){ charch; FILE*fp; fp=fopen("example.txt","w"); printf("Enterastring:"); while((ch=getchar())!='\n')

fputc(ch,fp);

fclose(fp);}

语言程序设计(第3版)张磊编著清华大学出版社第16页9.2.2最基本文献读写函数2.fgetc()函数从指定文献读入一种字符,该文献必须是以读或读写方式打开。一般使用如下形式调用fgetc()函数ch=fgetc(fp);其中,fp为文献型指针变量,ch为字符变量。正常情况下fgetc()函数返回值是从文献中读出一种字符。当打开文献并立虽然用fgetc()读文献时,fgetc()函数从文献开始位置读取一种字符。每读取一种字符后,文献位置指针后移一种字符位置。若目前读取是文本文献,当遇到文献结束标志时,fgetc()函数返回值为EOF。语言程序设计(第3版)张磊编著清华大学出版社第17页9.2.2最基本文献读写函数例9-3

使用fgetc()函数输出文献example.txt内容。/*programe9-3.c*/#include<stdio.h>voidmain(){ charch; FILE*fp; fp=fopen("example.txt","r"); while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);}

语言程序设计(第3版)张磊编著清华大学出版社第18页9.2.2最基本文献读写函数例9-4使用feof()进行文献读取控制,输出文献example.txt内容。/*programe9-4.c*/#include<stdio.h>voidmain(){FILE*fp;if((fp=fopen("example.txt","r"))==NULL){printf("filecannotopen!\n");exit(1);}

while(!feof(fp))

putchar(fgetc(fp));fclose(fp);}判断被读取文献是否已经读完。当未遇文献结束标志时,feof()值是0,不然feof()值是1。语言程序设计(第3版)张磊编著清华大学出版社第19页9.3文献数据块读写操作9.3.1fwrite()函数9.3.2fread()函数语言程序设计(第3版)张磊编著清华大学出版社第20页9.3.1fwrite()函数fwrite()函数功能是把内存中某些数据块写到指定文献中。一般调用形式fwrite(buffer,size,count,fp);其中:fp是接收数据文献指针;buffer是数据块内存首地址,一般是指针变量名、数组名等;size是一种数据块字节数(即数据块大小);count是执行一次fwrite()函数从内存输出到fp文献数据块数目。语言程序设计(第3版)张磊编著清华大学出版社第21页9.3.1fwrite()函数例9-5

从键盘上输入一批学生数据,然后以“stu_list”文献名存放到磁盘上。/*programe9-5.c*/#include<stdio.h>#defineN4structstudent_type{charname[10];intnum;intscore;}stud;voidmain(){ inti; FILE*fp; if((fp=fopen("stu_list","wb"))==NULL) { printf("Cannotopenfile\n"); exit(1); } printf("Inputdata,please!\n"); for(i=0;i<N;i++) {scanf("%s%d%d",,&stud.num,&stud.score);

fwrite(&stud,sizeof(structstudent_type),1,fp); } fclose(fp); printf("Allright.\n");}语言程序设计(第3版)张磊编著清华大学出版社第22页9.3.2fread()函数fread()函数把指定文献中一种数据块读到内存中。一般调用形式fread(buffer,size,count,fp);其中:fp是读取数据文献指针;buffer是接收文献数据内存首地址,一般是指针变量名、数组名等;size是一种数据块字节数(即数据块大小);count是执行一次fread()函数读取数据块数目。例9-6将上述stu_list文献内容显示在屏幕上。/*programe9-6-1.c*/#include<stdio.h>#defineN4structstudent_type{ charname[10]; intnum; intscore;}stud;voidmain(){ inti; FILE*fp; if((fp=fopen("stu_list","rb"))==NULL) { printf("Cannotopenfile.\n"); exit(1); } for(i=0;i<N;i++) { fread(&stud,sizeof(structstudent_type),1,fp); printf("%-10s%4d%4d\n",,stud.num,stud.score); } fclose(fp);}语言程序设计(第3版)张磊编著清华大学出版社第23页9.3.2fread()函数再如,设有如下定义:structstudent_type{charname[10];intnum;intage;}stud[40];其中,构造体数组stud每一种元素用来寄存一种学生有关数据,假设学生数据已寄存在磁盘文献中,且该文献已打开,并由fp指向,则能够用下面语句把文献中前40个学生数据输入到构造体数组stud中:for(i=0;i<40;i++)

fread(&stud[i],sizeof(structstudent_type),1,fp);语言程序设计(第3版)张磊编著清华大学出版社第24页9.4文献其他操作9.4.1文献格式化读写9.4.2文献随机读写操作9.4.3ftell()函数9.4.4文献字符串操作语言程序设计(第3版)张磊编著清华大学出版社第25页9.4.1文献格式化读写1.文献格式化读操作由fscanf()函数实现,从指定文献中,按照说明格式向变量提供数据。一般使用格式fscanf(fp,格式字符串,输入表列);其中fp是文献指针“格式字符串”和“输入表列”与scanf()函数有关内容相同。例如:fscanf(fp,“%d”,&m);该语句将磁盘文献中数据送给变量m,其中磁盘文献由fp指向。语言程序设计(第3版)张磊编著清华大学出版社第26页9.4.1文献格式化读写2.文献格式化写操作由fprintf()函数实现,将指定变量值按照一定格式写到指定文献中。一般使用格式fprintf(fp,格式字符串,输出表列);说明:⑴fp是要写入数据文献指针。⑵“格式字符串”和“输出表列”与printf()函数有关内容形同。例如:fprintf(fp,"%d",m);该语句将整型变量m按%d格式输出到fp指向文献中。例9-7从键盘输入一种字符串和一种十进制整数,将它们写入test文献中,然后再从test文献中读出并显示在屏幕上。/*programe9-7.c*/#include<stdio.h>voidmain(){ chars[100]; inta; FILE*fp; if((fp=fopen("test","w"))==NULL) {printf("fileopenerror.\n");exit(0);} fscanf(stdin,"%s%d",s,&a); fprintf(fp,"%s%d",s,a); fclose(fp); if((fp=fopen("test","r"))==NULL) {printf("Cannotopenfile.\n");exit(0);} fscanf(fp,"%s%d",s,&a); fprintf(stdout,"%s%d\n",s,a); fclose(fp);}

语言程序设计(第3版)张磊编著清华大学出版社第27页9.4.2文献随机读写操作1.fseek()函数功能:变化文献位置指针。调用形式fseek(fp,offset,position);其中:⑴fp为文献型指针;⑵文献位置指针定位由参数offset和position共同确定。position要求指针定位时基准位置,offset要求文献位置指针离开基准位置偏移量,它单位是字节。position值用整常数表达,取值范围是0、1、2三个数之一,其意义如下:0:表达基准位置为文献开头位置;1:表达基准位置为文献目前位置;2:表达基准位置为文献结尾位置,该位置在文献内容最后一种字节之后。语言程序设计(第3版)张磊编著清华大学出版社第28页9.4.2文献随机读写操作fseek()函数调用实例:fseek(fp,50L,0);将位置指针移到文献头起始第50个字节处fseek(fp,100L,1);将位置指针从目前位置向文献尾方向移动100个字节fseek(fp,-20L,2);将位置指针从文献末尾向文献头方向移动20个字节语言程序设计(第3版)张磊编著清华大学出版社第29页9.4.2文献随机读写操作例9-8在例9-6中建立了学生数据文献stu_list,将其中第3个学生成绩修改为97。/*programe9-8.c*/#include<stdio.h>structstudent_type{ charname[10]; intnum; intscore;}stud;voidmain(){ inti,size; FILE*fp; size=sizeof(structstudent_type); if((fp=fopen("stu_list","rb+"))==NULL) { printf("fileopenerror.\n"); exit(1); } fseek(fp,2*size,0); fread(&stud,size,1,fp); printf("%s%d%d\n",,stud.num,stud.score); printf("newscore:"); scanf("%d",&stud.score); fseek(fp,-size,1); fwrite(&stud,size,1,fp); fclose(fp);}语言程序设计(第3版)张磊编著清华大学出版社第30页9.4.2文献随机读写操作2.rewind()函数作用:将文献位置指针复位。调用形式rewind(fp);其中:fp为文献型指针。执行rewind()函数后,对于fp指向文献,不论目前文献位置指针在何处,都使它复位到文献开始位置。语言程序设计(第3版)张磊编著清华大学出版社第31页9.4.2文献随机读写操作例9-9

在屏幕上显示文献e9-6-2.c内容,并将该文献复制为文献e9-6-3.c。#include<stdio.h>voidmain(){ FILE*fp1,*fp2; fp1=fopen("e9-6-2.c","r"); fp2=fopen("e9-6-3.c","w"); while(!feof(fp1)) putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);}语言程序设计(第3版)张磊编著清华大学出版社第32页9.4.3ftell()函数ftell()函数用于获取文献位置指针,其调用形式如下:ftell(fp);其中:fp为文献指针。ftell()函数返回值是fp所指向文献目前读写位置,该值是一种长整型数,是位置指针从文献开始处到目前位置位移量字节数。语言程序设计(第3版)张磊编著清华大学出版社第33页9.4.3ftell()函数例9-10新建data.txt文献,检查文献位置指针值;然后将字符串"Beijing2023"写入文献中,再检查文献位置指针值。#include"stdio.h"main(){FILE*fp;longposition;fp=fopen("data.txt","w");position=ftell(fp);printf("position=%ld\n",position);fprintf(fp,"Beijing2023");

position=ftell(fp);

printf("position=%ld\n",position);fclose(fp);}语言程序设计(第3版)张磊编著清华大学出版社第34页9.4.4文献字符串操作1.fgets()函数一般调用形式fgets(buffer,n,fp);作用从fp指向文献中读取n-1个字符,然后存放到以buffer为首地址内存空间中,一般buffer是一种指针变量名、数组名等。假如在读入n-1个字符过程中遇到换行符或EOF,读入即结束。字符串读入后在最后加一种'\0'字符作为字符串结束标志。语言程序设计(第3版)张磊编著清华大学出版社第35页9.4.4文献字符串操作2.fputs()函数调用形式fputs(buffer,fp);作用将内存buffer中字符串写到fp指向文献中,buffer能够是一种字符串常量,也能够是字符串首地址。语言程序设计(第3版)张磊编著清华大学出版社第36页9.4.4文献字符串操作例9-11将字符串"VisualC++"和"Visualbasic"依次存入文献text中,然后将第一种字符串读出并显示出来。#include<stdio.h>voidmain(){ FILE*fp; charstring[20]; fp=fopen("text","w+"); fputs("VisualC++\n",fp); fputs("Visualbasic\n",fp); rewind(fp); fgets(string,20,fp); puts(string); fclose(fp);}语言程序设计(第3版)张磊编著清华大学出版社第37页9.5文献应用举例9.5.1文献复制9.5.2存放在文献中学生成绩排序语言程序设计(第3版)张磊编著清华大学出版社第38页9.5.1文献复制例9-12设计一种程序,实现任意文本文献复制。问题分析与算法设计⑴由于源文献是任意,因此源文献名应通过键盘输入;同样,生成目标文献名也应由键盘输入。⑵源文献以只读方式打开,目标文献以写方式打开。⑶从第一种字符开始,次序逐字符读出源文献,每读出一种字符,立即写入目标文献中,使用feof()函数判断源文献结束状态。实现程序#include<stdio.h>voidmain(){ charch,source[20],target[20]; FILE*fp_s,*fp_t; printf("Enterthesourcefilename:"); scanf("%s",source); printf("Enterthetargetfilename:"); scanf("%s",target); if((fp_s=fopen(source,"r"))==NULL) { printf("Cannotopensourcefile.\n"); exit(1); } if((fp_t=fopen(target,"w"))==NULL) { printf("Cannotopentargetfile.\n"); exit(1); } while(!feof(fp_s)) fputc(fgetc(fp_s),fp_t); fclose(fp_s); fclose(fp_t);}语言程序设计(第3版)张磊编著清华大学出版社第39页9.5.2存放在文献中学生成绩排序例9-13在例9-5中,我们建立了一种stu_list文献。编写程序,对该文献内容按照

温馨提示

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

评论

0/150

提交评论