版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 文件,6.1 C语言文件概述,1 C文件的概念 文件(file)是程序设计中一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。 以前各章中所用到的输入和输出,都是以终端为对象的,即从终端键盘输入数据,运行结果输出到终端上。从操作系统的角度看,每一个与主机相联的输入输出设备都看作是一个文件。例如,终端键盘是输入文
2、件, 显示屏和打印机是输出文件。 在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。,6.1.1 C语言中的文件与流,6.1 C语言文件概述,C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。如果有一个整数10000,在内存中占2个字节,如果按ASCII码形式输出
3、,则占5个字节, 而按二进制形式输出,在磁盘上只占2个字节。用ASCII码形式输出与字符一 一对应,一个字节代表一个字符,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。用二进制形式输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上以后又需要输入到内存的,常用二进制文件保存。,6.1.1 C语言中的文件与流,6.1 C语言文件概述,2 流 程序的输入输入,就是一个连续的字节序列的流入流出。C语言把它们统称为流。 一个C文件是一
4、个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限。换句话说,C语言中文件并不是由记录(record)组成的(这是和PASCAL或其他高级语言不同的)。在C语言中对文件的存取是以字符(字节)为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。 标准流有:stdin, stdout, stderr等。,6.1.1 C语言中的文件与流,6.1 C语言文件概述,在过去使用的C版本(如UNIX系统下使用的C)有两种对文件的处理方法:一种叫“缓冲文件系统”,一种叫“非缓冲文件系统”。所谓缓冲文件系统是指系统自动地在内存区为每一个正在使用的文件名开
5、辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。缓冲区的大小由各个具体的C版本确定,一般为512字节。,6.1.2 文件缓冲区,图6.2 文件缓冲区,6.1 C语言文件概述,缓冲文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。Turbo C在s
6、tdio.h文件中有以下的文件类型声明: typedefstruct shortlevel; /*缓冲区“满”或“空”的程度*/ unsignedflags; /*文件状态标志*/ charfd; /*文件描述符*/ unsignedcharhold; /*如无缓冲区不读取字符*/ shortbsize; /*缓冲区的大小*/ unsignedchar*baffer;/*数据缓冲区的位置*/ unsignedar*curp;/*指针,当前的指向*/ unsignedistemp;/*临时文件,指示器*/ shorttoken;/*用于有效性检查*/ FILE;,6.1.3 FILE类型与文件指
7、针,6.1 C语言文件概述,有了结构体FILE类型之后,可以用它来定义若干个FILE类型的变量,以便存放若干个文件的信息。例如,可以定义以下FILE类型的数组。FILEf5;定义了一个结构体数组f,它有5个元素,可以用来存放5个文件的信息。 可以定义文件型指针变量。如: FILE fp; fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。如果有n个文件,一般应设n个指针变量(指向FILE类型结构体的指针变量),使它们分别指向n个文件(确切地说指向存放该文件信息的结构
8、体变量),以实现对文件的访问。,6.1.3 FILE类型与文件指针,6.1 C语言文件概述,1 为文件命名 DOS和Windows下文件名是有差异的,文件名也包含路径。 2 建立文件指针 FILEfp1,fp2; 3 打开文件(fopen()函数)建立文件名与文件指针间的联系 fopen函数的调用方式通常为 FILEfp; fp=fopen(文件名,使用文件方式); 例如: fp=fopen(a1,r); 它表示要打开名字为a1的文件,使用文件方式为“读入” (r代表read,即读入),fopen函数带回指向a1文件的指针并赋给fp,这样fp就和文件a1相联系了,或者说,fp指向a1文件。可以
9、看出,在打开一个文件时,通知给编译系统以下3个信息:需要打开的文件名,也就是准备访问的文件的名字。,6.1.4 文件操作的基本步骤,6.1 C语言文件概述,使用文件的方式(“读”还是“写”等)。 让哪一个指针变量指向被打开的文件。 说明: (1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件(即输入文件),否则出错。 (2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的
10、文件,则在打开时将该文件删去,然后重新建立一个新文件。 (3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。,6.1.4 文件操作的基本步骤,6.1 C语言文件概述,(4) 用“r+”、“w+”、“a+”方式打开的文件既可以用来输入数据,也可以用来输出数据。用“r+”方式时该文件应该已经存在,以便能向计算机输入数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。 (5)
11、如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式 打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdioh文件中已被定义为0)。 常用下面的方法打开一个文件: if(fp=fopen(file1,r)=NULL) printf(cannot open this filen); exit(0); ,6.1.4 文件操作的基本步骤,6.1 C语言文件概述,(即先检查打开的操作有否出错,如果有错就在终端上输出“cannot open this file”。exit函数的作用是关闭所有
12、文件,终止正在调用的过程。待用户检查出错误,修改后再运行。 (6) 用以上方式可以打开文本文件或二进制文件,这是ANSI C的规定,用同一种缓冲文件系统来处理文本文件和二进制文件。但目前使用的有些C编译系统可能不完全提供所有这些功能(例如有的只能用“r”、“w”、“a”方式),有的C版本不用“r+”、“w+”、“a+”,而用“rw”、“wr”、“ar”等,请读者注意所用系统的规定。 (7) 在向计算机输入文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。,6.
13、1.4 文件操作的基本步骤,6.1 C语言文件概述,4 用文件操作函数进行文件操作 例如: 以字符为单位操作 以字符串为单位 格式化的输入输出 以数据块为单位 5 关闭文件 将文件缓冲区中的数据输出到磁盘文件,避免数据丢失。 释放文件信息区,使文件指针不再指向所联系的文件。,6.1.4 文件操作的基本步骤,6.2 文件操作,1 打开文件 打开文件函数: FILE *fopen(const *file,const *mode); FILEfp; fp=fopen(文件名,使用文件方式); 例如: fp=fopen(a1,r); 或者 if(fp=fopen(file1,r)=NULL) prin
14、tf(cannot open this filen); exit(0); 2 关闭文件 文件关闭函数 int fclose(FILE *fp);,6.2.1 文件的打开与关闭,6.2 文件操作,1 fseek()移动文件指针 int fseek(FILE *fp,long numbyte, int origin); origin:0为文件开始处;1为当前位置;2:文件末尾。 例如: fseek(fp1,20L,0); fseek(fp2,-10L,1); fseek(fp3,-20L,2); 2 ftell()取得当前文件指针 long ftell(FILE *fp); 3 rewind()将
15、当前文件指针重新定义到文件开始处 void rewind(FILE *fp);,6.2.2 文件的位置指针与读写定位,6.2 文件操作,1 基于字符文件读写 int fputc(int ch,FILE *fp); int fgetc(FILE *fp); int feof(FILE *fp); /测试文件尾 2 基于字符串的读写 int fputs(char *str,FILE *fp); char fgets(char *str,int length, FILE *fp); 3 格式化读写 int fprintf(FILE *fp,const char * control_string);
16、int fscanf(FILE *fp,const char * control_string); 3 基于数据块的操作 unsigned fwrite(void * buffer, int size, int n, FILE * fp); unsigned fread(void * buffer, int size, int n, FILE * fp);,6.2.3 文件的读写操作,6.2 文件操作,例6.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。 #include main() FILEfp; char ch,filename10; scanf(%s,file
17、name); if(fp=fopen(filename,w)=NULL) printf(cannot open filen); exit(0); ch=getchar( );/*接收在执行scanf语句时最后输入的回车符*/ ch=getchar();/*接收输入的第一个字符*/,6.2.3 文件的读写操作,6.2 文件操作,例6.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。 while(ch!=#) fputc(ch,fp);putchar(ch); ch=getchar(); fclose(fp); 运行情况如下: file1c (输入磁盘文件名) computer and c#(输入一个字符串) computer and c (输出一个字符串),6.2.3 文件的读写操作,6.2 文件操作,例6.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 #include main() FILEin,out; char ch,infile10,outfile10; printf(Enter the infile name:n); scanf(%s,infile); printf(Enter the outfile name:n); scanf(%s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026考研数学二历年真题|附解析版
- 全国统考数学一模拟试卷|2025考研(历年真题+模拟)
- 教师即兴演讲考试题目及答案
- 积分变换考试题及答案
- 考研数学二模拟试卷全套-2023(可打印版)
- 江苏南京鼓楼区力学小学2027届四年级数学第一学期期末统考试题含解析
- 道路结冰考试题及答案
- 燃气施工考试题及答案
- 九江市星子县2026-2027学年三年级数学第一学期期末达标检测试题含解析
- 2025年上海市老旧住宅楼管道天然气入户改造可行性研究报告
- GB/T 21387-2025供水系统用轴流式止回阀
- 设备除锈与刷漆标准规范手册
- 铁路工务安全教育课件
- 前列腺疾病课件
- 2025-2030年中国药食同源行业市场现状调查及未来趋势研判报告
- 装修电话营销培训
- 2025年澳洲amc9年级竞赛题库及答案
- 晋江大神合同
- 合同支付条款补充协议
- 钢丝绳安全使用培训课件
- 马克思主义理论前沿探索
评论
0/150
提交评论