C语言第12章 文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

言中,文件以字符(字节)为单位进行存取。 (文件被看作是一个由字符(字节)组成的序列! 也称“流式文件”)
2
文件的分类
从用户的角度看:
文件分为标准设备文件和磁盘文件。
从数据在文件中的组织形式看:
ASCII码文件(字符代码文件、文本文件)
它的每个字节存放一个ASCII代码,代表一个字符
二进制文件
4
缓冲文件系统和非缓冲文件系统
缓冲文件系统
(标准文件系统 、高层文件系统)
磁盘文 件系统
系统自动地在内存区为每一个正在使用的文 件开辟一个缓冲区
非缓冲文件系统
(系统输入输出和低层输入输出系统) 系统不自动开辟确定大小的缓冲区,而由程 序为每个文件设定缓冲区。
5
输出文件缓冲区
内存数据区
输出
缓冲区的作用
35
【例12-6】从键盘输入10个学生的姓名和三门课程的 成绩,并计算出每个人的平均成绩,然后将所有数据 存放到文本文件st.dat中。
#include "stdio.h"
#define NO 10 struct student {char name[9]; int score[3]; float ave;
缓冲区的设置

由文件系统自动为文件设置所需的缓冲区,缓 冲区的大小随机器而异。 非缓冲区文件系统不是由系统自动设置缓冲区, 而是由用户自己根据需要设置。
7

12.2 文件类型
文件类型指针
是一个结构体变量,用来存放所有文 件信息:文件状态、当前位置、缓冲 区的有关信息如地址、缓冲区中未被 处理的字符数,文件操作方式等。

上述打开的文件都是针对文本文件,如果要打开二 进制文件,必须在使用方式面添上字符“ b” ,如 rb 表 示以只读方式打开一个二进制文件。

17
标准设备文件指针
系统中定义有三个标准设备文件指针:

stdin:标准输入文件(只读),指向终端输 入设备(键盘)。 stdout:标准输出文件(只写),指向终端输 出设备(显示器)。
}stud[NO];
36
main( ) {int i,j,sum; FILE *fp; if((fp=fopen("st.dat", "w"))==NULL) {printf("Can’t open thisfile!\n"); exit(0);} for(i=0;i<NO;i++) {scanf("%s",stud[i].name); sum=0; for(j=0;j<3;j++) {scanf("%d",&stud[i].score[j]); sum+=stud[i].score[j]; } stud[i].ave=sum/3.0;}
1.fgetc( )函数 调用形式: ch=fgetc(fp); 功能:从fp所指向的文件读入一个字符,函数的返 回值就是它读入的字符,读入时如果遇到结束符, 则函数返回文件结束标记EOF。
ch=fgetc(fp); while(ch!=EOF) {putchar(ch); ch=fgetc(fp);}
char file[ ]="D:\\USER\\STUDENTS.DAT";
if (!(fp=fopen(file, "rb+")))
{printf("Open file %s error!\n", file);
exit(0);} ... ... fclose(fp);
22
12.4
文件的读写
读写一个字符的函数 —fgetc( )和fputc( )
把内存中的数据按照其在内存中的存储形式原样 输出到磁盘上存放
3
文本文件和二进制文件
内存存储形式 ASCII形式
(‘6’) 00110110 (‘0’) 00110000 (‘3’) 00110011 (‘8’) 00111000 00010111
10010110
(6038)
二进制形式
00010111 10010110
23
2.feof( )函数
调用形式:feof(fp);
功能:判断文件是否结束,用于从二进制文件读入 数据。 while(!feof(fp))
{ch=fgetc(fp);…}
3.fputc( )函数
调用形式: fputc(ch,fp);
功能:把一个字符ch写到fp所指向的文件中。输出 成功返回值就是输出的字符,如果失败,则返回文 件结束标记EOF。
24
读写数据块的函数 —fread( )和fwrite( ) 1.fread( )函数
调用形式: fread(buffer,size,count,fp);
2.fwrite( )函数
调用形式: fwrite(buffer,size,count,fp); buffer:是一个指针,是存放读/写数据的起始地址。 size: 要读/写字节数。 count:要读/写多少个size字节的数据项。 fp: 文件型指针。 fread(f,4,2,fp); 函数调用成功:返回count的值。
fopen( )函数的调用形式:
FILE *指针变量名; 指针变量名=fopen(文件名,使用方式);

返回值


若成功,返回指向被打开文件的指针 若失败,返回空指针值NULL
12
文件使用方式及符号含义
方 式 “r” 含 义
只读,为读打开一个文本文件
“w”
“a” “ rb ” “ wb ”
只写,为写打开一个文本文件 追加,向文本文件尾部追加数据
31
格式化读写函数 —fscanf( )和fprintf( ) 1.fscanf( )函数
调用形式:fscanf(文件指针,格式字符串,输入地址表列);
fscanf(fp,“%d,%f”,&i,&f); 2.fprintf( )函数
调用形式:fprintf(文件指针,格式字符串,输出表列);
fprintf(fp,“%3d,%6.1f”,i,f);
文 件 的 打 开 举 例
15



”r”方式只能用于从文件向计算机输入数据,不能向 文件输出数据,而且要求该文件已经存在,否则函数 fopen( )将返回空指针值NULL。
“w”方式只能用于向文件输出数据,不能从该文 件中输入数据,如果打开时原文件不存在,则新建该 文件,如果原文件已经存在,则删除原文件里的数据。
stderr:标准错误输出文件(读/写),指向 终端输出设备(显示器)。


18
程序运行时
系统自动打 开标准文件 系统自动定 义文件指针
标准输入 标准输出 标准出错输出 stdin stdout stderr
19
常用的文件打开方法
if ((fp=fopen(“file1”,”r”)==NULL) {printf(“cannot open this file!\n”); exit(0);} if(!(fp=fopen("file1", "r"))) {printf(“cannot open this file!\n"); exit(0); }
“ab+”
读写,为读/写建立一个二进制文件
读写,为读/写建立或打开一个二进制文件
表二
14
FILE *fp,*fq,*fr,*fs*fp2; fp=fopen("a.dat", "r"); /*为读打开一个已存在的文本文件*/ fq=fopen("w.dat", "w"); /*为写打开一个新的文本文件*/ fr=fopen("w.dat", "wb"); /*为写打开一个新的二进制文件*/ fs=fopen("t.dat", "w+"); /*为读/写打开一个新的文本文件*/ fp2=fopen("C:\HOME\FILE2.TXT", "rb+"); /*以二进制读写方式打开FILE2.TXT */
函数exit( )的作用是关闭所有的文件,终止正在 调用的过程,待修正错误以后再继续运行。
20
12.3.2 文件的关闭(fclose函数)

fclose函数的调用形式:
fclose(文件指针);

功能:
文件关闭,释放缓冲区。 返回值: 文件正常关闭,返回0;否则返回EOF。

21
文件的关闭举例
FILE *fp;
该结构体类型是系统定义的,包 含在stdio.h中,取名为FILE。
8
FILE类型
typedef struct { short level; /*缓冲区满空程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*无缓冲则不读取字符*/ short bsize; /*缓冲区大小*/ unsigned char *buffer; /*数据缓冲区指针*/ unsigned char *curp; /*当前位置指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ } FILE;
Biblioteka Baidu件类型指针
FILE *fp;
fp -- 指向FILE类型结构体的指针变量。 通过文件指针fp可以引用fp指向的文件。 注意 FILE不是结构体变量名,而是用typedef 定义的一个新结构体类型名。 用到文件时,系统就为此文件开辟一个 如上的结构体变量,用户通过设置一个指 向该结构体变量的文件指针,就可以访问 该文件了。

“a”方式表示不删除原文件里的数据,而是从文件 的末尾开始添加数据,要求被打开的文件已经存在, 打开后,文件的位置指针将定位在文件的尾部,如果 要打开的文件不存在,则函数fopen( )返回一个空指 针值NULL。

16
“r+,w+,a+” 方式打开的文件,既可以从文件输入 数据,也可以向文件输出数据。其中“r+”只允许打开 已存在的文本文件;“ w+” 方式系统新建一个文件, 先向文件输出数据,然后才能从文件输入数据;“ a+” 方式是打开已经存在的文件,并且文件的位置指针定 位在文件的末尾,先准备向文件添加数据,以后也可 以从文件输入数据。
输出
磁盘
输入
输入
输入文件缓冲区
从内存向磁盘输出数据必须先送到“输出缓冲区”
中,装满缓冲区后才一起送到磁盘去。 从磁盘向内存读入数据,一次先将一批数据输入 到“输入缓冲区”中,数据充满后再逐个将数据 送给内存数据区。
6
缓冲区的目的

减少对磁盘的读写次数。

减少了移动磁头并寻找磁道扇区的次数。
只读,为读打开一个二进制文件 只写,为写打开一个二进制文件
“ ab ”
追加,向二进制文件尾部追加数据
表一
13
方 式 “r+” “w+” “a+” “rb+”


读写,为读/写打开一个文本文件 读写,为读/写建立一个文本文件 读写,为读/写打开或建立一个文本文件 读写,为读/写打开一个二进制文件
“wb+”
37
写入盘文件
st.dat
for(i=0;i<NO;i++) fprintf(fp, "%s %d %d %d%5.1f",
stud[i].name,stud[i].score[0],
stud[i].score[1],stud[i].score[2],
stud[i].ave);
fclose(fp); }
38
12.5
1.rewind( )函数
文件的定位
调用形式:rewind(文件指针); 功能:使位置指针重新返回文件的开头,无返回值。
【例12-7】将磁盘文件”st.dat”的内容显示在 屏幕上,然后将其复制到磁盘文件”st.c”中。 #include "stdio.h" main( ) {FILE *fp1,*fp2;
41
if((fp1=fopen("st.dat", "r"))==NULL) {printf("Can’t open this file!\n"); exit(0);} if((fp2=fopen("st.c", "w"))==NULL) {printf("Can’t open this file!\n"); 内容显示 返回文件头 exit(0);} while(!feof(fp1))putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1))fputc( fgetc(fp1),fp2); fclose(fp1);fclose(fp2); } 复制文件
第12章
文件概述


文件类型指针
文件的打开和关闭
文件的读写 文件的定位 文件出错检测
1
12.1
数据集合。
C文件概述
文件是存储在外部介质(磁盘等)上被命了名的
所有的I/O设备也都是文件。如磁盘文件、 磁带文件、卡片文件、打印机文件等。
操作系统以文件为单位对数据进行管理;C语
10
12.3

文件的打开和关闭
对文件处理的一般过程: 打开文件-读/写文件-关闭文件

文件的打开(fopen函数) 文件的关闭(fclose函数)
11
文件的打开函数fopen( )
fopen( )函数为编译系统提供以下信息:
需要打开的文件名 文件的使用方式(读还是写等 fp = fopen)(“a.dat”, “r”); 文件的指针变量 fq = fopen ("b.dat", “w”);
相关文档
最新文档