210 likes | 337 Views
福州职业技术学院 计算机系. 21 世纪高职高专计算机系列规划教材. 语言程序设计. 中国铁道出版社. 第 13 章 文件. 第一节 文件的打开与关闭 一、文件概述 文件:存储在外部介质上数据的集合 , 在使用时才调入内存中来。. 1 、从用户的角度来看,可分为普通文件和设备文件两种. 普通文件:存储介质文件,驻留在磁盘或者其他外部介质上的一个有序数据集,可以是源文件、目标文件、可执行文件;也可以是一组待输入处理的原始数据,或者是一组输出的结果。
E N D
福州职业技术学院 计算机系 21世纪高职高专计算机系列规划教材 语言程序设计 中国铁道出版社
第13章 文件 第一节 文件的打开与关闭 一、文件概述 文件:存储在外部介质上数据的集合,在使用时才调入内存中来。
1、从用户的角度来看,可分为普通文件和设备文件两种1、从用户的角度来看,可分为普通文件和设备文件两种 普通文件:存储介质文件,驻留在磁盘或者其他外部介质上的一个有序数据集,可以是源文件、目标文件、可执行文件;也可以是一组待输入处理的原始数据,或者是一组输出的结果。 设备文件:非存储介质(键盘、显示器、打印机等),指与主机相连的各种外部设备。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,把键盘指定为标准输入文件。
2、按文件的编码格式来看,文件可分为ASCII文件和二进制文件两种2、按文件的编码格式来看,文件可分为ASCII文件和二进制文件两种 文本文件: ASCII文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放一个字符的ASCII码, 二进制文件:是按照二进制的编码方式来存放文件的。二进制文件虽然可以在屏幕上显示,但其内容无法读懂。
缓冲文件系统: 所谓的缓冲文件系统是指系统自动地在内存区为每一个正在使用地文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存地缓冲区,装满缓冲区后才一起送到磁盘中去。如果充磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个将数据送到程序数据区(给程序变量)。
二、文件的的打开 FILE *fp; Fp=fopen(文件名, 打开方式);
文件使用方式 含义 “r”(只读) 为输入打开一个文本文件 “w”(只写) 为输出打开一个文本文件 “a”(追加) 向文本文件尾增加数据 “rb”(只读) 为输入打开一个二进制文件 “wb”(只写) 为输出打开一个二进制文件 “ab”(追加) 向二进制文件尾增加数据 “r+”(读写) 为读/写打开一个文本文件 “w+”(读写) 为读/写建立一个新的文本文件 “a+”(读写) 为读/写打开一个文本文件 “rb+”(读写) 为读/写打开一个二进制文件 “wb+”(读写) 为读/写建立一个新的二进制文件 “ab+”(读写) 为读/写打开一个二进制文件
三、文件的关闭 fclose(文件指针);
第二节文件的读写 一、fputc函数和fgetc函数 1.fputc函数 把一个字符写到磁盘文件上去。调用形式为 fputc(ch,fp); 2.fgetc函数 从指定的文件读入一个字符,该文件必须是以读或读写的方式打开的。调用形式为 ch=fgetc(fp);
【例】从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个’#’号为止。【例】从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个’#’号为止。 #include "stdio.h" void main() {FILE *fp;char ch; if((fp=fopen("c:/unzipped/readme.txt","w")) ==NULL) {printf("Cannot open this file!");exit(0);} ch=getchar(); while(ch!='#') { fputc(ch,fp); ch=getchar();} fclose(fp); }
【例2】将磁盘文件readme.txt中的信息赋值到另外一个磁盘文件readyou.txt中。【例2】将磁盘文件readme.txt中的信息赋值到另外一个磁盘文件readyou.txt中。 void main() { FILE *sour,*des; char ch; if((sour=fopen("readme.txt","r"))==NULL) {printf("Cannot open this file!");exit(0);} if((des=fopen("readyou.txt","w"))==NULL) {printf("Cannot open this file!");exit(0);} ch=fgetc(sour); while(ch!=EOF) {fputc(ch,des); ch=fgetc(sour); } fclose(sour); fclose(des); }
二、fread函数和fwirte函数 一次性读入一组数据(例如一个实数或者一个结构体变量的值)。 fread( buffer, size, count, fp); fwrite(buffer, size, count, fp); 其中buffer是一个地址。size是要读写的字节数。count:要进行读写多少个字节的数据项。fp 文件型指针。
【例3】从键盘上输入4个学生的有关数据,然后把它们转存到磁盘文件上去。【例3】从键盘上输入4个学生的有关数据,然后把它们转存到磁盘文件上去。 struct student { int num; char name[20]; char sex; char addr[30]; }stu[2]={{9908,"Fengjian",'m',"FuZhou"}, {9909,"Wanghai",'f',"Xiamen"}}; void main() { FILE *fp;int i; if((fp=fopen("readme.dat","wb"))==NULL) {printf("Cannot open this file!");exit(0);} fwrite(stu,sizeof(struct student),2,fp); fclose(fp); }
【例4】从磁盘文件上读出学生的信息,并显示在屏幕上。【例4】从磁盘文件上读出学生的信息,并显示在屏幕上。 void main() {struct studentstu; FILE *fp; int i; if((fp=fopen("readme.dat","rb"))==NULL) {printf("Cannot open this file!");exit(0);} printf(" Num\tName\t\tSex\tAddr\n"); for(i=0;i<2;i++) {fread(&stu,sizeof(struct student),1,fp); printf("%d\t%10s\t%c\t%s\n",stu.num, stu.name,stu.sex,stu.addr); } fclose(fp);}
三、其他读写函数 1.fprintf函数和fscanf函数 是格式化读写函数。它们的读写对象是磁盘文件,而表示数据终端。 fprintf(文件指针, 格式字符串, 输出表列); 功能将内存中的变量按照指定格式输出到文件中去 fscanf(文件指针, 格式字符串, 输入表列); 功能从文件中读取指定格式的数据到内存中的变量
2.putw函数和getw函数 用来对磁盘读写一个字(整数)。 putw() 用于将内存中的数据输出到指定的文件中去。 getw() 用于从指定的磁盘文件中读取一个整数到内存。 3.fgets函数和fputs函数 fgets(str,n,fp) 作用是从指定文件读入一个字符串。 fputs(str,fp) 作用是向指定的文件输出一个字符串。
第三节文件的定位 一、rewind 函数 rewind 函数的作用是使位置指针重新返回文件的开头。此函数没有返回值。 【例】有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。
#include "stdio.h" void main() { FILE *fp1, *fp2; fp1=fopen("c:\\f1.txt","r"); fp2=fopen("c:\\f2.txt","w"); while(!feof(fp1)) putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2); }
二、fseek函数和随机读写 用fseek可以实现改变文件的位置指针。 fseek 函数的调用形式为 fseek(文件类型指针, 位移量, 起始点) 起始点用0、1、2来代替,其中0 代表文件开始,1代表当前位置,2代表文件末尾。 位移量是以起始点为基点,向前移动的字节数。 fseek一般用于二进制文件。
三、ftell函数 作用是获得流式文件的当前位置,用相对于开头的位移量来表示。如果返回 -1L表示出错。
总结与作业 P217/课后作业