09-第九章-文件-C语言编程设计教程
- 格式:pdf
- 大小:839.64 KB
- 文档页数:34
文件分类 缓冲文件系统 文件的指针 文件打开与关闭 文件应用
第九章 文件 文件是指存储在外部介质 上,且按文件名访问的一组 信息序列。
一、文件分类 文本文件(字符代码文件或ASCII代码文件) 由一个一个字符组成,每一个字符用一个 ASCII 代码表示, 如 123.45 以 ASCII 代码形式 存储到磁盘需要6个字节。 特点:可通过显示器或打印机显示,即可读, 比较直观。
[例3]:具有文件拷贝功能的程序filecopy.c 说明两个问题:命令行参数的应用和文件的字 符输入与输出应用。
fgetc( fp )
功能:从指定文件读入一个字符。
fputc( ch, fp )
功能:把一个字符写到指定文件中去。
[例3]:具有文件拷贝功能的程序filecopy.c
#include <stdio.h> #include <process.h> #include <string.h> filecopy(FILE *fp1, FILE *fp2){ char c; while((c=fgetc(fp1))!=EOF) fputc(c, fp2); }
功能:将输出按格式串规定输出到fp所指文件。
fscanf( fp, 格式字符串, 输入项表列)
功能:从fp所指文件按格式串读入数据。函数执行成功
返回读得的数据项个数;若在读第一项前已到达文件 结束处,则返回EOF。
#include <stdio.h> #include <process.h> #include <string.h> void main(){ FILE *fp; char name[10]; int num; float score; if((fp=fopen("file3.txt","w+"))==NULL){ printf("cannot open this file .\n"); exit(0); } printf("enter name,num,score:"); scanf("%s %d %f",name, &num, &score); while(strlen(name)>1){ fprintf(fp,"%s %d %f\n",name, num, score); printf("enter name,num,score:"); scanf("%s %d %f",name, &num, &score); }
buffer为输入输出在内存中存放的首地址。 size为读、写的字节数,即数据块的大小。 count为输入输出的数据项个数。 fread()和fwrite()用于二进制文件的输入 输出
#include <stdio.h> #include <process.h> #define SIZE 4 struct student{ char name[10]; int num, age; char addr[15]; }stud[SIZE]; void save_load(){ FILE *fp; int i; if((fp=fopen("stu_list","wb+"))==NULL){ printf("cannot open file.\n"); exit(0); } for(i=0; i<SIZE; i++) if(fwrite(&stud[i],sizeof(struct student),1,fp)!=1){ printf("file write error!\n"); exit(0); }
一、文件分类 非文本文件(二进制文件 ):是指以数据 在内存中的存储形式原样输出存储到磁盘上的 文件。如123.45在内存中以浮点数形式存储占 4个字节,不管一个实数多大都占4字节。 特点: 节省存储空间, 输入输出无需转换 速度快,不便阅读。
说明: 一个 C 文件是一个字节流或二进制流,它把 数据看作是一连串的字符序列(字节),而不 考虑记录的界限,即C文件并不是由记录组成的。 由于对文件的操作要与各种外部设备发生联 系,因此对文件的输入输出(读写)过程是通 过操作系统来实现的。对文件的读写都是通过 标准的I/O函数进行的。
的字符 文件操作方式 *_nextc下一个字符位 置(指针) *_buff 文件缓冲区位 置(指针)
…………… ……………
读/写
磁盘 文件
_mode
文件输入/输出 缓冲区
内存
程序与外部 文件的联接 示意图,具 体操作由文 件管理系统 负责
文件使用方式
r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ (只读) (只写) (追加) (只读) (只写) (追加) (读写) (读写) (读写) (读写) (读写) (读写)
输入: zhang 1001 19 room_101 ↙ li 1002 20 room_102 ↙ wang 1003 21 room_103 ↙ zhao 1004 21 room_104 ↙ 输出: zhang 1001 19 room_101 li 1002 20 room_102 wang 1003 21 room_103 zhao 1004 21 room_104
二、缓冲文件系统(标准I/O)和非缓冲文件系统 缓冲文件系统(又称标准或高层文件系统) 特点:对程序中的每一个文件都在内存中开辟 一个“缓冲区”。 作用:从磁盘文件读入的数据先送到“输入缓 冲区”中,然后再从缓冲区依次将数据送给接 收变量。
内存 变量a 输入文件缓冲区 (512KB)
读
磁盘 文件
2. 文件的关闭
文件的关闭形式:
fclose(fp);
功能:将fp所指文件关闭。 释放文件有关信息区; 将输出文件缓冲区的内容(无论缓冲区是否为满)
都输出写入文件,然后关闭文件,这样可防止丢 失本来应写入文件的数据。
五、文件应用示例 [例1]:格式化的输入输出。 fprintf( fp, 格式字符串, 输出项表列)
功 能 : buffer 所 指 存 储 单 元 的 数 据 取
size*count个字节送fp所指文件。返回写到fp 所指文件中的数据项个数。
[例2]:数据块(二进制形式)的读写。
fread( buffer, size, count, fp) fwrite( buffer, size, count, fp) 说明:
Hale Waihona Puke rewind(fp); for(i=0; i<SIZE; i++) if(fread( &stud[i], sizeof(struct student), 1, fp)!=0 ) printf("%-10s %4d %4d %-15s\n", stud[i].name, stud[i].num,stud[i].age, stud[i].addr); } void main(){ int i; for(i=0; i<SIZE; i++) scanf("%s %d%d%s", stud[i].name, &stud[i].num, &stud[i].age,stud[i].addr); save_load(); }
写
程序数据区
输出文件缓冲区 (512KB)
在向磁盘文件输出数据时,先将程序数据区中变量 或表达式的值送到 “ 输出文件缓冲区 ” 中,待装满后 才一起输出给磁盘文件。目的减少对磁盘的读写次数, 即一次可以读入一批数据或输出一批数据。
二、缓冲文件系统(标准I/O)和非缓冲文件系统 非缓冲文件系统:不由系统自动设置所需 缓冲区,而由用户自己根据需要设置。 新的ANSI标准只建议使用缓冲系统,并对 缓冲文件系统的功能进行了扩充,使既能用于 处理字符代码文件,也能处理二进制文件。
说明:
文件名可以是字符串常量、数组名或字符指针。 使用文件方式参见附表。
FILE *fp; if((fp=fopen("文件名","使用文件方式"))==NULL){ printf("cannot open this file.\n"); exit(0); }
用户程序与数据区 FILE相应的结构变量 fp _fd 文件号 _cleft缓冲区中剩余
#include <stdio.h>
培 育 英 才
钻 研 科 学
第九章
#include <math.h> #define EPS 1e-7 void main(){ double udf_sin(double x); double a; scanf("%lf",&a); printf("%f } double udf_sin( double x ){ double sum, term, n=1; //用户自定义函数 %f\n",udf_sin(a), sin(a));
三、文件型指针类型 对文件的操作是通过文件指针实现的。关键 的概念是“文件指针”。 调用一个文件需要的信息: 文件当前读写的位置; 与该文件对应的内存缓冲区的地址; 缓冲区未被处理的字符数(字符指针); 文件的操作方式等
三、文件型指针类型 系统内部定义了一个称FILE的结构型类型。 typedef struct{ int int int char char }FILE; _fd; _cleft; _mode; *_nextc; *_buff; //文件号 //缓冲区中剩余的字符 //文件操作模式 //下一个字符位置 //文件缓冲区位置