《C语言程序设计与数据结构》第10章 文件读写
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“a” “r+” “w+”
“a+”
“rb” “wb”
打开一个已经存在的二进制文件,只能读取数据 打开一个二进制文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原 有内容并接受写入的数据(覆盖) 打开一个已经存在的二进制文件,只能写入数据(追加在文件的尾部) 打开一个已经存在的二进制文件,可以读取数据,也可以写入数据 打开一个二进制文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在, 则删除文件中原有内容,并接受写入的数据(覆盖) 打开一个已经存在的二进制文件,可以读取数据,也可以写入数据(追加在文件的尾部)
C语言程序设计与数据结构
10.3
文件位置指针的有关函数
在文件内部有一个位置指针,用来指向文件的当 前读写字节。在文件打开时,该位置指针总是指向 文件的第一个字节。使用下面章节介绍的fgetc等函 数对文件进行读写后,该位置指针将自动向后移动。 但文件指针和文件内部的位置指针不是一回事。 文件指针是指向整个文件的,须在程序中定义说明, 只要不重新赋值,文件指针的值是不变的。文件内 部的位置指针用以指示文件内部的当前读写位置, 每读写一次,该指针均自动向后移动,它不需在程 序中定义说明,而是由系统自动设置的。
C语言程序设计与数据结构
10.1
文件概述与文件指针
所谓“文件”是指一组相关数据的有序集合。 我们在前几章中已多次接触使用过文件,例如 源程序文件、目标文件、可执行文件、库文件 (头 文件)等。
C语言程序设计与数据结构
10.1.1 文件分类
文件通常是驻留在外部介质(如磁盘等)上的,在使 用时才调入内存中来。C语言把文件看作是由一个 个字符(字节)的数据顺序组成的。它把数据看作 是连续的字符(字节)流,这样它对文件的存取实 际上是以字符(字节)为单位的。输入输出的数据 流的开始和结束只受程序的控制而不受特定符号 (比如回车换行符)的控制。也就是说,C语言在 输出数据到文件中时,并不会自动增加回车换行符 以示结束,在输入时也不会以读入回车换行符作为 数据的间隔。
第10章 文件读写
C语言程序设计与数据结构
教学提示:存储在变量和数组(即内存)中的数据 是临时的,这些数据在程序运行结束后会消失,而 文件可以用来永久地保存大量的数据。如果有些数 据需要反复使用或永久保存,应该考虑使用文件来 完成。 教学要求:本章要掌握文件在读写之前必须打开, 读写结束必须关闭。文件可按只读、只写、读写、 追加四种操作方式打开,同时还必须指定文件的类 型是二进制文件还是文本文件。文件可按字节,字 符串,数据块为单位读写,文件也可按指定的格式 进行读写。文件内部的位置指针可指示当前的读写 位置,移动该指针可以对文件实现随机读写。
C语言程序设计与数据结构
rewind函数
rewind函数的功能是把文件内部的位置指针移到 文件首。其调用形式为: rewind(文件指针); “文件指针”指向被移动的文件。
C语言程序设计与数据结构
fseek函数
fseek函数用来移动文件内部位置指针,其调用形式 为: fseek(文件指针,位移量,起始点); 其中: “文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是 long型数据,以便在文件长度大于64KB 时不会出 错。当用常量表示位移量时,要求加后缀“L”。 “起始点”表示从何处开始计算位移量,规定的起 始点有三种:文件首,当前位置和文件尾。
C语言程序设计与数据结构
起始点 文件首 当前位置 文件末尾
表示符号
数字表示
SEEK_SET
0
SEEK_CUR
1
SEEK_END
2
C语言程序设计与数据结构
例如: fseek(fp,100L,0); /* 将文件位置指针移到离文 件头100个字节处 */ fseek(fp,20L,1); /* 将文件位置指针从当前位置 后移20个字节的位置 */ fseek(fp,-10L,SEEK_END); /* 将文件位置指针从文 件末尾前移10个字节的位置 */
C语言程序设计与数据结构
10.2.1 文件的打开
所谓打开文件,实际上是获得文件的各种有关信 息,并使文件指针指向该文件,以便进行下一步操 作。C语言提供了函数fopen来打开文件。 其使用格式为: 文件指针名=fopen(文件名, 使用文件方式); 其中,“文件指针名”必须是已被说明为FILE 类 型的指针变量;“文件名”是将被打开的文件的文 件名,通常是字符串常量或字符串数组(注意路径 的分隔符应使用“\\”);“使用文件方式”是指 文件的类型和操作要求,是一个由一对双引号括起 来的字符串,共有12种,具体的符号表示和含义见 表10-1。
C语言程序设计与数据结构
顺序读写和随机读写
文件的读写方式分为顺序读写和随机读写。 (1) 顺序读写即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分,为 了解决这个问题可移动文件内部的位置指针到需要读写的 位置,再进行读写,这种读写称为随机读写。 (2) 随机读写可以通过利用系统函数去主动移动文件内部 的位置指针来实现。这样的函数主要有两个,即 rewind 函 数和fseek函数。实现随机读写的关键是要按要求移动位置 指针,这称为文件的定位。在移动位置指针之后,即可用 后面介绍的任一种读写函数进行读写。由于一般是读写一 个数据据块,因此常用fread和fwrite函数。
C语言程序设计与数据结构
【例10.1】将C盘根目录下的文本文件test1.txt的内容在屏幕上输出。 #include<stdio.h> main() { FILE *fp; /* 定义了文件指针fp */ char ch; if((fp=fopen("c:\\test1.txt","r"))==NULL) /*以读文本文件方式打开并使fp指向该文件*/ { printf("\nCannot open file, strike any key to exit!"); getchar(); exit(1); } ch=fgetc(fp); /* 先读出一个字符,然后进入循环 */ while(ch!=EOF) /* 判断文件是否结束 */ { putchar(ch); /*把该字符显示在屏幕上*/ ch=fgetc(fp); /*再读入下一字符 */ } fclose(fp); printf(“\n”); } 本例程序的功能是从文件中逐个读取字符,并在屏幕上显示。如打开文件出错,给出提示并退出程序。只 要读出的字符不是文件结束标志EOF,就把该字符显示在屏幕上,再读入下一字符。每读一次,文件 内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示文件c:\test1.txt 的所有内容。
C语言程序设计与数据结构
10.1.2 文件类型指针
在C语言中要使用文件,必须用一个指针变量指向一个 文件,这个指针称为文件指针。通过文件指针就可对它所 指的文件进行各种操作。 定义文件指针的一般形式为:FILE *指针变量标识符; 其中FILE必须为大写,它是在头文件stdio.h中定义的一 个结构体,该结构体中含有文件名、文件状态和文件当前 位置等信息,我们编程时不必关心FILE结构的细节。 例如: FILE *fp;表示定义了一个名为fp的文件指针。 如果变量fp已被正确赋值,则可以根据结构变量fp所提供的 信息找到一个文件并实施对该文件的操作。习惯上把fp称为 指向一个文件的指针。
C语言程序设计与数据结构
10.4 读写文件
10.4.1字符读写函数fgetc和fputc 是以字符(字节)为单位的读写函数。每次可从文件读出或 向文件写入一个字符。字符输入/出函数所处理的文件可以 是文本文件,也可以是二进制文件。 10.4.2字符串读写函数fgets和fputs 处理的文件一般是文本文件,读写的数据以字符串为单位。 10.4.3数据块读写函数fread和fwtrite 用于整块数据的读写函数。可用来读写一组数据,如一 个数组、一个结构变量的值等。 10.4.4格式化读写函数fscanf和fprintf 与前面使用的scanf和printf 函数的功能相似,都是格式 化读写函数。两者的区别在于fscanf函数和fprintf函数的读 写对象不是键盘和显示器,而是磁盘文件。
C语言程序设计与数据结构
10.2.2 文件关闭函数
在使用完一个文件以后,应该将该文件关闭,以 防止它再被调用或丢失数据。“关闭”就是使文件 指针变量不再指向该文件,也就是文件指针变量与 该文件“断开”,此后不能通过该指针对原来与其 相联系的文件进行读、写操作(除非再次打开该文 件,使文件指针变量重新指向该文件)。 fclose()函数用来关闭一个已经由fopen()函数打开 的文件,正常完成关闭文件操作时,fclose函数返 回值为0,有错误发生则返回非零值。 其调用的一般形式为: fclose(文件指针); 例如: fclose(fp);
C语言程序设计与数据结构
10.1.1 文件分类
从用户的角度看,文件可分为普通文件和设备文件 两种。 根据文件的存储形式,可分为ASCII码文件和二进 制文件两种: (1) ASCII文件也称为文本文件,这种文件在磁盘中 存放时每个字符对应一个字节,用于存放对应的 ASCII码。例如一个整型数据1234在文本文件中占 4个字节。我们用Windows自带的记事本软件打开 该类型文件能读懂文件中的内容。 (2) 二进制文件是按二进制的编码方式来存放文件 的。例如一个整型数据230在二进制文件中占2个字 节。
C语言程序设计与数据结构
读字符函数fgetc
fgetc函数的功能是从指定的文件中读取一个字符,函数调用 的一般形式为: 字符变量=fgetc(文件指针); 例如:ch=fgetc(fp); 其意义是从打开的文件fp中读取一个字 符并送入字符变量ch中。 对于fgetc函数的使用有以下几点说明: (1) 在fgetc函数调用中,读取的文件必须是以读或读写方式打 开的。 (2) 读取字符的结果也可以不向字符变量赋值,例如fgetc(fp); 但是读出的字符不能保存。 (3) 文件内部的位置指针在文件打开时总是指向文件的第一 个字节。使用fgetc函数后,该位置指针将向后移动一个字 节。因此可连续多次使用fgetc函数来读取多个字符。
C语言程序设计与数据结构
文件使用方式 “rt” 打开一个已经存wk.baidu.com的文本文件,只能读取数据
含义
“wt”
打开一个文本文件,只能写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在,则删除文件中原有 内容,并接受写入的数据(覆盖)
打开一个已经存在的文本文件,只能写入数据并且追加在文件的尾部 打开一个已经存在的文本文件,可以读取数据,也可以写入数据 打开一个文本文件,可以读取数据,也可以写入数据。若文件不存在,则自动建立一个新文件接受写入的数据;若文件存在, 则删除文件中原有内容,并接受写入的数据(覆盖) 打开一个已经存在的文本文件,可以读取数据,也可以写入数据(追加在文件的尾部)
注意:fseek函数一般用于二进制文件。在文本文 件中由于要进行转换,往往计算的位置会出现错误。
C语言程序设计与数据结构
ftell函数: 用来得到流式文件中的当前位置,用 相对于文件开头的位移量来表示。如返回-1L则表 示出错。 例如:long a; a=ftell(fp); 文件结束检测函数feof 函数feof( )判断文件是否处于文件结束位置,如文 件结束,则返回值为1,否则为0。 其调用格式为: feof(文件指针); 说明:文件结束标志EOF (每个文件末有一结束标 志EOF,值为-1)只适用于判断文本文件是否结束。 而函数feof( )则对文本文件和二进制文件都适用。
“ab” “rb+” “wb+”
“ab+”
C语言程序设计与数据结构
fopen打开文件
例如: FILE *fpTa; fpTa=fopen("c:\\cprogram\\abc","rb"); /*反斜线“\\”中的第一个表示转义字符*/ 其意义是打开C驱动器磁盘的cprogram子目录下的 文件abc,这是一个二进制文件,只允许按二进制 方式进行读操作。 又如: FILE *fp; fp= fopen ("mytest1.txt","r"); 其意义是在当前目录下打开文件mytest1.txt,只允 许进行“读”操作,并使fp指向该文件。
C语言程序设计与数据结构
10.2
文件的打开与关闭
使用文件必须遵循“先打开,再对文件进行读 写操作,最后关闭文件”的原则。 在C语言中,对文件的这些操作都可以由库函 数来完成,对用到的库函数的声明包含在文件 stdio.h中,因此在编程中要操作文件时,要使用头 文件包含命令#include “stdio.h”。