颜晖
计算机程序设计 (C)
42
0705004
yqfjc02@dlc.zju.edu.cn
第十章 文 件
?文件概念
▄ 文件:是保存在外存储器上的一组数据的有
序集合。
▄ 文件的特点是:
( 1)数据长久保存
( 2)数据 长度不定
( 3)数据按 顺序存取
▄ C语言中的文件完全是字节代码的序列(字
节流) 可以看作为磁带 字节,,,,,,,,字节字节字节字节字节
……
第十章 文 件
?文件有两种数据形式:
▄ ascii码 (文本文件 text stream) a.c 程序文件
文本文件是字符流
▄ 二进制码 (二进制文件 binary stream) a.exe 执行文件
二进制文件是直接把内存数据以二进制形式保存。
?对于一个整型数 1234:
▄ 以 文本文件 保存,它是四个字符:
ascii码分别是,49 50 51 52 ;
▄ 以 二进制文件 保存,它是 1234的二进制数 0x04D2
由于磁盘速度相对很
低,直接把数据写到
磁盘会效率很低
文 件
?缓冲文件系统:
▄ 向磁盘输出数据:数据 缓冲区,
装满缓冲区后 磁盘文件。
▄ 从磁盘读入数据:先 一次性 从磁盘文件将 一
批数据 输入到缓冲区,然后再从缓冲区 逐个
读入数据到变量 。
内存单元 内存单元
数据
……
缓冲器
512字节
…… 文件
由操作
系统自
动完成程序控制
文件名用什么标识
文 件
?文件类型指针
▄ 使用一个文件指针,来指示文件缓冲区中具
体读写的位置。 文件指针变量
▄ 文件指针定义,FILE *fp ;
文件类型
数据
……
缓冲器
512字节
…… 文件
由操作
系统自
动完成程序控制
文件名
fp
文 件
?文件类型指针
▄ 文件指针定义,FILE *fp ;
文件类型 文件指针变量
▄ C语言中允许同时使用多个文件,每个文件
都有各自的缓冲区,用不同的文件指针分别指
示。
问题,如何使 fp与具体文件挂钩?
文件的打开
?文件打开
使文件指针与相应文件实体对应起来
▄ 格式:
fp= fopen(“文件名”,“文件使用方
式”)
如,fp = fopen("a.dat","r")
▄ 作用:
1 在磁盘中找到文件 a.dat
2 在内存中开辟 512个字节的缓冲区,并由
fp指示文件缓冲区起始位置
3 把首块 512字节数据:磁盘 缓冲器
以后程序只对文件指针
进行操作,即用 fp代表磁盘
文件。
文件使用方式 ( ASCII码文件),
,r” 仅从已建立的文件 读 取数据
,w” 仅把数据 写 到一个 新 建文件

,a” 仅把数据 写 到 已 建立的文件

文件基本读写
?我们可以这样看,
▄ 文件 看作 一个数组(缓冲器),
▄ 文件指针 看作 是指向数组元素的指针,
▄ 文件操作:对文件指针所指的缓冲器单元进
行存取,
▄ 限制,文件的读写一般是 顺序 进行的,位
置完全由文件指针控制,并且文件指针的改
变也由 系统 控制。
文件基本读写
?C语言文件读写函数
磁盘文件操作 键盘操作
ch= fgetc( fp ) ch=getchar( )
fputc(ch,fp) putchar( ch)
fscanf( fp,“格式”,输入表 ) scanf( )
fprintf( fp,“格式”,输出表 ) printf( )
它们的说明在 stdio.h中
文件基本读写
例:将一个已存在的文件 a.dat的内容拷贝到 b.dat文件中。
FILE *fpa,*fpb; (1) 定义文件指针
char c; int i;:
fpa=fopen("a.dat","r"); fpb=fopen("b.dat","w");
(2) 打开文件并建立相应指针
c=fgetc(fpa); fputc(c,fpb); (3) 文件读写
c=fgetc(fpa); fputc(c,fpb);
fscanf(fpa,"%d ",&i); fprintf(fpb,"%d",i);
fscanf(fpa,"%d ",&i); fprintf(fpb,"%d",i);
fclose(fpa);
fclose(fpb); (4) 关闭打开的所有文件
每一次读 /写,文
件指针自动 ++
‘a’
‘b’
3
5
文件基本读写
?文件程序
{ FILE *fpa,*fpb; (1) 定义文件指针
fpa=fopen("a.dat","r");
(2) 打开文件并建立相应指针
c=fgetc(fpa);
fputc(c,fpb); (3) 文件读写
fscanf(fpa,"%d ",&i);
fprintf(fpb,"%d",i);
fclose(fpa); (4) 关闭打开的所有文件
}
#include "stdio.h"
main( )
{ FILE *fpa,*fpb;
if ((fpa=fopen("d:\\tc\\a.dat","r"))= =NULL)
{ printf("cannot open file a.dat!"); exit(0); }
if ((fpb=fopen("d:\\tc\\b.dat","w"))= =NULL)
{ printf("cannot open file b.dat!"); exit(0); }
while ( ! feof(fpa))
fputc(fgetc(fpa),fpb);
if (fclose(fpa))
{ printf("cannot close file a.dat!"); exit(0); }
if (fclose(fpb))
{ printf("cannot close file b.dat!"); exit(0); }
}
当 fpa指向文件末尾
时,feof(fpa) = =非零
fclose(fp) = 0 正常 / 1 有错
fp = =NULL,
表明文件不能正常打开
c=fgetc(fpa);
while ( c!=EOF)
{ fputc(c,fpb);
c=fgetc(fpa); }
文件基本读写
?例:统计文件的行数
main( )
{ FILE *fp ; int n=0; chat c;
if ((fp=fopen("d:\\tc\\a.dat","r"))= =NULL)
{ printf("cannot open file a.dat!"); exit(0); }
while ( ! feof(fp)) {
c = fgetc(fpa);
if (c = = ?\n?) n++ ;
}
printf(“%d\n”,n);
if (fclose(fpa))
{ printf("cannot close file a.dat!"); exit(0); }
}