64
第 7 第 第第第第第第第第

第 7 章 文件处理程序设计

  • Upload
    katen

  • View
    94

  • Download
    11

Embed Size (px)

DESCRIPTION

第 7 章 文件处理程序设计. 主要内容. 如何将一个文件复制到另一个文件 文件的打开和关闭 出错检查 文件的顺序读写 如何读取某个客户的银行帐号信息 文件定位 文件的随机读写. 提出问题. 如何将一个文件的内容复制到另一个文件中?. 问题的分析. 前面程序处理的数据要么是直接 写在程序中 ,要么是在程序运行时由 键盘输入 ,而程序的处理结果只在 屏幕 上 显示 。当程序要处理大量数据时,这种数据处理方式就会带来诸多不便。. 问题的分析. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 7 章 文件处理程序设计

第 7 章 文件处理程序设计

Page 2: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

主要内容 如何将一个文件复制到另一个文件

文件的打开和关闭 出错检查 文件的顺序读写

如何读取某个客户的银行帐号信息 文件定位 文件的随机读写

Page 3: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

提出问题如何将一个文件的内容复制到另一个文件中?

Page 4: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的分析前面程序处理的数据要么是直接写在程序中,要么是在程序运行时由键盘输入,而程序的处理结果只在屏幕上显示。当程序要处理大量数据时,这种数据处理方式就会带来诸多不便。

Page 5: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的分析操作系统是以文件为单位对数据进行管理的,如果要找外存上的数据,必须先按文件名找到指定的文件,然后再从该文件中读取数据;如果要向外部介质上存储数据也必须先建立一个文件才能向它输出数据。文件中最常见的操作就是将一个文件中的内容复制到另一个文件中去。哪么文件是什么呢?

Page 6: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的基本概念所谓“文件”一般指存储在介质上的数据的集合。在 C 语言中,文件就是由一个一个的字符或字节的数据顺序组成的字符或字节序列,换句话说, C语言是把一个文件看作是一个有序的字节流。

Page 7: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

C 语言对文件的存取是以字节为单位的,也就意味着以字符形式进行操作。

每一个文件通常以文件结束标志( end-of-file ,也就是 EOF )结束,

Page 8: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的分类从用户的角度,文件分为:

标准设备文件普通磁盘文件

从文件的编码方式,文件分为:ASCII 文件二进制文件

Page 9: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件分类 从用户的角度分文件分为

标准设备文件普通磁盘文件

把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。

Page 10: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

键盘为标准的输入文件,文件指针为 stdin 。从键盘上输入就意味着从标准输入文件上输入数据。如 scanf 、 getchar 函数。

显示器为标准输出文件,文件指针为 stdout 。在屏幕上显示有关信息就是向标准输出文件输出。如 printf 、 putchar 函数。

标准错误输出也是标准设备文件,文件指针为 stderr 。

本章所讲的文件主要是针对普通的磁盘文件。

Page 11: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件分类从文件编码的方式分:

ASCII 码文件。也称为文本文件,在磁盘中存放时每个字符对应一个字节,用于存放对应的 ASCII码。

二进制文件。数据按其在内存中的存储形式原样存放。

Page 12: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

ASCII 文件也称文本文件; ASCII 文件在磁盘中存放时,每个字符对应一个字节,用于存放对应的 ASCII 码。如:整型十进制数 5678 ,按 ASCII 文件存放则需要占用 4 个字节。

Page 13: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

二进制文件是对不同的数据类型,按其实际占用内存字节数存放。即内存的存储形式,原样输出到磁盘上存放。如:整型十进制数 5678 ,按二进制文件存放只需要 2 个字节。

0010111000010110

0010111000010110

0011011000110101 0011100000110111

ASCII 形式

二进制形式

内存中的存储形式

Page 14: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

内存存储形式

二进制文件形式

00110000 00111001

00110000 00111001

图 7-2 两种文件形式与内存形式之间的关系

1 的 ASCII 2 (50) 3 (51) 4 (52) 5 (53)

码为(49)

ASCII 文件(文本文件)形式

00110010 00110011 00110100 00110101 00110001

1

实例十进制整数 12345 的存储形式如图 7-2 所示。按 ASCII 码形式存储共占用 5 个字节,而采用二进制形式存储只需要 2 个字节。

Page 15: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

ASCII 码文件可在屏幕上按字符显示,例如源程序文件就是 ASCII 文件,用 DOS 命令 TYPE 可显示文件的内容。由于是按字符显示,因此能读懂文件内容。占用存储空间大,在进行读、写操作时要进行二进制与十进制之间的相互转换, 效率低。 二进制文件 虽然也可在屏幕上显示,但其内容无法读懂。但二进制文件 占用存储空间少,在进行读、写操作时不用进行二进制与十进制之间的相互转换,效率高。

Page 16: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件系统 根据操作系统对文件的处理方式的不同,把文件系统分为

缓冲文件系统非缓冲文件系统

ANSI C 标准采用缓冲文件系统。

Page 17: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

缓冲文件系统缓冲文件系统是指操作系统在内存中为每一个 正在使用的文件开辟一个读写缓冲区。如图 7-1 所示。

图 7 - 1 缓冲文件系统示意图

内 存

输出

( 写 )

输入

( 读 )

外存

输出缓冲区

文件

输入缓冲区

程序数据区

输出

Page 18: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

在输入数据时,先把数据从磁盘读到“输入缓冲区”,等输入缓冲区已满或强制把它 清空时再把其中的数据 送到程序数据区进行处理。处理完后的数据要送到文件中保存,先放到“输出文件缓冲区”,等输出缓冲区已满或强制把它 清空时再把其中的数据 送到磁盘文件。

Page 19: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

非缓冲文件系统非缓冲文件系统指系统不自动开辟确定大小的内存缓冲区,而是由程序自己为每个文件设定缓冲区。

Page 20: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

在 C 语言中, 没有专门的文件输入输出语句,对文件的读写都是用库函数来实现的。

基本的文件操作都在标准 I/O库接口 stdio.h 中。

调用磁盘上的一个文件时,必须知道与该文件有关的信息。比如文件名字、文件的当前读写位置、文件缓冲区大小与位置、文件的操作方式等。这些信息被 C 语言系统保存在一个称作 FILE 的结构体中,通常它被放在 stdio.h头文件内。

Page 21: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

typedef struct{ int level; /* 缓冲区“满”或“空”的程度 */ unsigned flags; /*文件状态标志 */ char fd; /*文件描述符 */ unsigned char hold;/*如无缓冲区不读取字符 */ int bsize; /* 缓冲区大小 */ unsigned char *buffer; /*数据缓冲区位置 */ unsigned char *curp; /*文件定位指针 */ unsigned istemp; /* 临时文件指示器 */ short token; /*用于有效性检查 */}FILE;

Page 22: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件指针对于每一个要操作的文件,都必须定义一个指针变量,并使它指向该文件结构体变量,这个指针称为文件指针。通过文件指针找到被操作文件的描述信息,就可对它所指的文件进行各种操作。FILE *指针变量标识符;

其中 FILE应为大写。

Page 23: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的操作对文件的操作的一般步骤包括 :

打开文件文件的读写关闭文件

在C语言中,文件操作 都是由库函数来完成的。这些库函数包含在 stdio.h头文件中。

Page 24: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的打开与关闭 打开文件是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它各种操作。关闭文件是断开指针与文件之间的联系,禁止再对该文件进行操作。

Page 25: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的打开 文件指针名 =fopen( 文件名 ,使用文件方式 );

如: FILE *fp1;fp1=("c:\\tt\\test.exe","rb"); 其意义是打开 C 驱动器磁盘的 tt 目录下的文件 test.exe ,

这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“ \\” 中的第一个表示转义字符,第二个表示根目录。

Page 26: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的打开使用函数 fopen() ,函数原型为:FILE *fopen(char *filename , char *type);

filename 为需要打开的文件名, type 为文件打开的类型,也是一个字符串,用于确定文件的使用方式,可以选用的方式如下:

Page 27: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

“r” :文件以“读”方式打开,文件指针只能用于输入操作,并且文件必须已经存在。

“w” :文件以“写”方式打开,文件指针只能用于输出操作,如果文件不存在,将会用指定的文件名创建一个新文件。如果已存在同名文件,那么此同名文件的内容会被删除。

“a” :文件以“追加”方式打开,此模式与“ w”模式相似,返回的指针都可以用于输出操作;它们的区别在于,如果文件已经存在,本方式将不会删除原来的内容,而是向文件的末端写入新信息。

文件常用的访问模式如表 7-1 所示。

Page 28: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University文件使用方式 意  义

r 只读打开一个文本文件,只允许读数据 w 只写打开或建立一个文本文件,只允许写数据

a 追加打开一个文本文件,并在文件末尾写数据

rb 只读打开一个二进制文件,只允许读数据

wb 只写打开或建立一个二进制文件,只允许写数据

ab 追加打开一个二进制文件,并在文件末尾写数据

r+ 读写打开一个文本文件,允许读和写

w+ 读写打开或建立一个文本文件,允许读写

a+ 读写打开一个文本文件,允许读,或在文件末追加数据

rb+ 读写打开一个二进制文件,允许读和写

wb+ 读写打开或建立一个二进制文件,允许读和写

ab+ 读写打开一个二进制文件,允许读,或在文件末追加数据

Page 29: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的关闭 fclose(文件指针 );

功能:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。返回值:关闭成功时返回值为 0。否则 (如磁盘空间不足、写保护或关闭已经关闭的文件 ) 返回 EOF,即 -1。

Page 30: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件的关闭使用函数 fclose() ,函数原型为:int fclose(FILE *stream);

其中: stream 为文件流指针。它的作用是使文件指针变量不再指向该文件,同时关闭文件。当文件正常关闭时,返回 0值;当文件关闭失败时,返回非 0值。

Page 31: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

【例 7-2 】打开 test.txt 文件。#include <stdio.h>#include <stdlib.h>void main(){ FILE *fp; /* 定义文件指针 */ fp=fopen("test.txt","w"); /* 以写方式打开文件 test.txt

*/ if(fp==NULL) { printf("file open error!\n"); exit(0); /* 终止程序运行,返回操作系统 0值 */

} else printf("fiel open OK!\n"); fclose(fp); /* 关闭文件 */}

Page 32: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

exit 函数原型为:void exit(int status);

功能:终止程序。它将 status 的值发送给 DOS环境变量。它在 stdlib.h 中声明。

Page 33: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

出错检查 文件在进行打开操作的时候,并不能保证每次操作都会成功,操作也可能失败。比如,有可能不存在指定的文件进行读操作等。如果需要的文件不存在或者发现其他错误,那么 fopen 函数调用将返回指针值 NULL ,表示有错误发生。作为程序员,应该检查错误并且进行相应的错误报告。一般 C 系统都提供了库函数检测错误,主要错误检测函数如下:

Page 34: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

1.错误报告函数的原型为:void error(char *errorstring);2.文件结束检测错误函数的原型为:int feof(FILE *stream);3.文件出错检测函数的原型为:int ferror(FILE *stream);4.清除文件错误标志函数的原型为:void clearerr(FILE *stream);

Page 35: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

错误处理#include <stdio.h>#include <errno.h>#include <io.h>#include <fcntl.h>void main(){

/* c:\abc.abc 文件并不存在 */int fh = open("c:\\abc.abc", O_RDONLY | O_BINARY);

if (fh == -1) /* fh 必然为 -1 */{

perror("Can't open c:\\abc.abc. Error");}

}

Can't open c:\\abc.abc. Error: No such file or directoryCan't open c:\\abc.abc. Error: No such file or directory

Page 36: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

顺序文件的读写 文件的顺序读写,是指文件被打开后,按照数据

流的先后顺序对文件进行读写操作。每读写一次后,文件指针自动指向下一个读写位置。

在C语言中提供了多种文件读写的函数,分别如下:( 1 )字符读写函数: fgetc 和 fputc 。( 2 )字符串读写函数: fgets 和 fputs 。( 3 )格式化读写函数: fscanf 和 fprinf 。

Page 37: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fgetc 函数的功能是从指定的文件中读一个字符,函数原型为:

int fgetc(FILE *stream);

fputc 函数的功能是把一个字符写入指定的文件中,函数原型为:

int fputc(char ch,FILE *stream);

Page 38: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University【例 7-3 】从键盘输入字符存入文件中,以 # 号结束#include <stdio.h>void main(){ FILE *fp; char ch,filename[10]; scanf("%s",filename); if ((fp=fopen(filename, "w"))==NULL) /* 建立并打开新文件 */ { printf("cannot open file!\n"); exit(0); /* 终止程序 */ } ch=getchar(); /* 读 scanf 的回车符 */ ch=getchar(); /* 输入第一个字符 */ while(ch!= '#') /* 如果输入 # 号则结束 */ { fputc(ch,fp); /* 将 ch 写入 fp 所指向的文件 */ putchar(ch); /* 将 ch 在屏幕上输出,即写入 stdin 所指向的文件 */ ch=getchar(); } fclose(fp); /* 关闭文件 */}

Page 39: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fgets 函数的功能是从 fp 所指向的文件中读 n-1 个字符,放到以 string 为起始地址的存储空间 (string可以是数组名 ) 。函数原型为:

char * fgets(char *string, int n, FILE *fp);

Page 40: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

【例 7-4 】从 temp.txt 文件中读入一个含 10 个字符的字符串

#include<stdio.h>void main(){ FILE *fp;

char str[11];if((fp=fopen("temp.txt","r"))==NULL) /* 以只读方式打开一个文件 */{

printf("Cannot open file strike any key exit!");getch();exit(1); /* 打开不成功的处理方式 */

}fgets(str,11,fp); /* 打开文件成功,读取 10 个字符,放在 str串中 */printf("%s",str); /* 打印读取字符串 */fclose(fp); /* 操作完成,关闭文件 */

}

Page 41: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fputs 函数的功能是将 string 所表示的字符串内容( 不含最后的‘ \0’) 输出到 fp 所指向的文件中去。函数原型为:

int fputs(char *string, FILE *fp);

Page 42: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

【例 7-5 】向文件 string.txt 中追加一个字符串。 #include<stdio.h>void main(){ FILE *fp;

char ch,st[20];if((fp=fopen("string.txt","a"))==NULL) /* 以追加方式打开一个文件 */{

printf("Cannot open file strike any key exit!");getch();exit(1); /* 打开不成功的处理方式 */

}printf("input a string:\n"); scanf("%s",st); /* 从键盘读入一个串 */fputs(st,fp); /* 将串写入文件中 */fclose(fp);if((fp=fopen("string.txt","r"))==NULL){

printf("Cannot open file strike any key exit!");getch();exit(2); /* 打开不成功的处理方式 */

}ch=fgetc(fp); /* 读取文件中的 第一个字符 */while(ch!=EOF) /* 反复打印读出的字符,再读下一个字符 */{

putchar(ch);ch=fgetc(fp);

}printf("\n");fclose(fp); /* 操作完成,关闭文件 */

}

Page 43: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fscanf 函数、 fprintf 函数与前面使用的 scanf 和 printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和 fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。

Page 44: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fscanf 函数的功能是按照 format给出的控制符 格式,把从 fp 所指向的文件中读取的内容,分 别赋给变元 arg1,…,argn 。函数原型为:

int fscanf(FILE *fp, char *format, &arg1, …, &argn)

Page 45: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

fprintf 函数的功能是按照 format给出的控制符 格式,将变元 arg1,…,argn 的值写入到 fp 所指向的文件中去 。函数原型为:

int fprintf(FILE *fp, char *format, arg1, …, argn)

Page 46: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

【例 7-6】键盘输入两个学生数据,写入一个文件中, 再读出这两个 学生的数据显示在屏幕上。 源代码见教材 P277

Page 47: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的实现(例 7-1 )#include<stdio.h>void main(){

FILE *fp1,*fp2; /* 定义文件指针 */ 源文件 目标char ch,*file1,*file2;printf("Input source file :");scanf("%s",file1); /* 输入源文件名 */printf("Input object file :");scanf("%s",file2); /* 输入目标文件名 */if((fp1=fopen(file1,"r"))==NULL) /* 以只读方式打开要拷贝的文件 */{

printf("Cannot open %s\n",file1);getch(); /* 暂停,按任意键继续 */exit(1); /* 文件打开不成功的处理 */

}if((fp2=fopen(file2,"w"))==NULL) /* 以写的方式打开拷贝的目标文件 */

fp2=stdout; /* 缺省输出文件为标准输出设备即到显示器 */while((ch=fgetc(fp1))!=EOF) /* 读第一个文件的字符 */

fputc(ch,fp2); /* 拷贝到第二个文件 */fclose(fp1); /* 关闭文件 1 */fclose(fp2); /* 关闭文件 2 */

}

Page 48: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

举一反三:读入文件,在屏幕上输出#include<stdio.h>void main(){

FILE *fp; /* 定义文件指针 */char ch;if((fp=fopen("temp.c","r"))==NULL) /* 以只读方式打开文件 */{

printf("Cannot open file strike any key exit!"); getch(); exit(1); /* 文件打开不成功的处理 */

} ch=fgetc(fp); /* 读文件的第一个字符 */

while (ch!=EOF) /* 读文件没有到文件尾 */{

putchar(ch); /* 输出刚刚读入的字符 */ch=fgetc(fp); /* 读下一个字符 */

} fclose(fp); /* 关闭文件 */}

Page 49: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University从键盘输入一行字符,写入一个文件, 再把该文件内容读出显示在屏幕上。#include<stdio.h>void main(){

FILE *fp; /* 定义文件指针 */char ch;if((fp=fopen("string","wb+"))==NULL) /* 以读写方式打开文件 */{

printf("Cannot open file strike any key exit!"); getch(); exit(1);/* 文件打开不成功的处理 */

}

Page 50: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai Universityprintf("input a string:\n");ch=getchar(); /* 读入一行字符,每次只读一个 */while (ch!='\n'){

fputc(ch,fp); /* 写字符到文件中 */ ch=getchar(); /* 读下一个字符 */

}if((fp=fopen("string","rb"))==NULL) /* 以读方式打开文件 */{

printf("Cannot open file strike any key exit!"); getch(); exit(2); /* 文件打开不成功的处理 */

}ch=fgetc(fp); /* 读第一个字符 */while(ch!=EOF){

putchar(ch); /* 输出字符 */ ch=fgetc(fp); /* 读下一个字符 */

}printf("\n"); fclose(fp); /* 关闭文件 */

}

Page 51: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的提出前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。但在实际问题中常要 求只读写文件中某一指定的部分。

Page 52: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的提出【例 7-9】建立一个程序维护银行的账目信息。希望程序能够更新、添加和删除账号,并且能够把所有当前账号清单存储在一个用于打印的文本文件中。如何读取某个客户的银行帐号信息?

Page 53: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的分析为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。下面以维护客户的银行帐号为例说明文件的随机读写。

Page 54: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

随机读写,是指在对文件进行读写操作时,可以对文件中指定位 置的信息进行读写操作。实现随机读写的关键是要按要求移动位置指针,这样就需要对文件进行定位。一般地,随机读写适合于具有固定长度记录的文件,这样的文件称为随机存取文件。

Page 55: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

随机存取文件的记录具有相同的结构,能够直接而且快速地访问。访问的基本思路就是通过记录关键字的函数计算每一条记录相对于文件起始点的位置,然后直接访问指定的记录,达到快速访问的目标。

Page 56: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

C 语言提供了一组用于随机读写的定位函数,其函数原型都在 stdio.h 中。采用随机读写,可以在不破坏其它数据的情况下把数据插入到文件中去,也可以不 重写整个文件而更新和删除以前存储的数据。

Page 57: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件定位 前面对文件的读写方式都是顺序读写。要求只读写文件中某一指定的部分,可 移动文件内部的位置指针到需要读写的位置再进行读写,这种读写称为随机读写。

Page 58: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

在结构体类型 FILE 中有一个 文件定位指针( unsigned char *curp;),实现随机读写的关键是要按要求移动该位置指针,这称为文件定位。

Page 59: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

文件位置指针置于文件开头rewind(文件指针 );

功能:重置文件位置指针到文件开头,无返回值。

Page 60: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

移动文件内部位置指针 fseek(文件指针 ,位移量 , 起始点 );

功能:改变文件位置指针的位置,成功时返回 0;失败时返回非 0值。

其中: 文件指针:指向被移动的文件。位移量:表示以起始位置为基准移动的字节数。 起始点:表示从何处开始计算位移量,规定的起始点有三种:文件首、当前位置和文件尾。

Page 61: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

使用 fread() 和 fwrite() 来实现 【例 7-6】键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。

源代码见教材 P283

Page 62: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

【例 7-10】在学生文件 stu_list.dat 中读出 第二个学生的数据

#include<stdio.h>struct stu{ char name[10]; int num; int age; char addr[15];}boy,*qq; /* 定义结构体变量 */void main(){ FILE *fp; /* 定义文件指针 */ char ch; int i=1; qq=&boy;

if((fp=fopen("stu_list.dat","rb"))==NULL) /* 以只读方式打开文件 */ { printf("Cannot open file strike any key exit!"); getch(); exit(1); /* 打开文件不成功的处理 */ } rewind(fp); /*移动文件指针到文件首部 */ fseek(fp,i*sizeof(struct stu),0); /*移动文件指针,跳过第一个结构体数据 */ fread(qq,sizeof(struct stu),1,fp);/* 读第二个结构体数据 */ printf("\n\nname\tnumber age addr\n");/* 打印读出的数据 */ printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,qq->addr); fclose(fp); /* 关闭文件 */}

Page 63: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

问题的实现(例 7-9 )首先,建立一个能够存储 100 个定长记录的借贷处理系统。每一条记录由账号(用作记录关键字)、姓名和借贷金额组成。所编写的程序要能 够更新、插入和删除一条记录以及能够以格式化文本形式列出所有的记录。显然,使用随机文件可以较好的实现这样的功能。 源代码见教材 P285

Page 64: 第 7 章 文件处理程序设计

计算中心编制

上海大学上海大学 Shanghai University

举一反三 【例 7-11 】从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。 源代码见教材 P288