第十二章 文 件
文件概念
▄ 文件:是保存在外存储器上的一组数据的有序集合。
▄ 文件的特点是:
( 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); }
}