c8_c语言课件_第1页
c8_c语言课件_第2页
c8_c语言课件_第3页
c8_c语言课件_第4页
c8_c语言课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2002年06月C语言程序设计第八章文件操作 该章的学习内容学点什么哪?了解C语言文件是一种流式文件,流式文件的基本单位是字节; 了解文件内数据的组织形式; 掌握C语言对文件的操作库函数,主要包括缓冲文件系统的文件打开函数fopoen,文件关闭函数fclose及主要的文件读写函数; 了解输入输出的重定位;简单了解非缓冲文件系统。 本章的学习难点1.fopen函数和fclose函数的使用方法,注意对文件进行读写之前应使用fopen函数打开文件,在使用结束后应使用fclose函数关闭文件。 2. 几种文件读写函数的区别及其灵活运用: 对指定文件进行一个字符输入/输出时使用fgetc、fputc函数

2、; 对指定文件进行格式化读写使用fscanf、fprintf函数; 对指定文件进行块读写使用 fread、fwrite函数; 3. rewind和fseek文件定位函数的区别及其使用方法: rewind函数强制使文件的位置指针指向文件的开头; fseek函数控制文件位置的指针进行随机读写; 本章目录C文件概述文件指针 文件的打开和关闭 标准IO及其重定向文件的读写*文件的定位*非缓冲文件系统C文件概述问题的提出如果将程序的处理结果只输出在屏幕上,当要查看结果时,必须每次都运行一次程序。如果运行程序所需要输入的数据每次都相同时,每次都手工输入,势必造成数据的可靠性下降,加大操作者的工作量。怎么办

3、?文件概述文件是指存储在外部介质上的数据的集合。数据是以文件的形式存放在外部介质上的。且由文件名来识别。文件操作要求输出:建立文件 输出数据输入:已有文件 输入数据C文件的分类按数据组织形式分ASCII 文件二进制文件又称文本文件。每个字节存一个ASCII码,代表一个字符。是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。123:49 50 51 abc:97 98 99123:1111011 abc:97 98 99C文件中数据的存储方式字符流式存储,C文件不是由记录组成,而是把数据看成是一连串的字符(字节),并按字节进行处理,该文件称为流式文件。对流式文件的存储是以字符 (字节)

4、为单位的,输入输出的数据流的开始和结束仅受程序控制而不受物理符号 (如回车换行符)控制。输出时不自动增加回车换行符以作为记录结束的标识;输入时不以回车换行符作为记录间隔。C语言对文件处理方式缓冲文件系统非缓冲文件系统是指自动地在内存区为每一个正在使用的文件开辟一个一般为512B缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,缓冲区满后,才一起送到磁盘去;如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区(给程序变量) 。一般用于处理文本文件。用缓冲文件系统进行输入输出又称为高级(高层) 磁盘输入输出(高层IO)。非缓冲文件系统

5、是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统主要处理二进制文件。用非缓冲文件系统进行输入输出又称为低级(低层) 磁盘输入输出系统。文件指针打开的文件所有信息都存在一个结构体变量中,该结构体类型是系统提供的,其类型名为FILE。(该类型在stdio.h中定义)Typedef struct short level; /*缓冲区“满”或“空”程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ short token; /*用于有效性检查*/ FILE;文件类型指针对于文件的操作,是通过指向该文件的文件指针来进行的

6、。即通过该结构体变量中的文件信息来访问文件。文件指针就是指向FILE结构类型的指针变量。文件指针定义 FILE *fp; FILE *f5;文件的打开与关闭文件的打开fopen函数文件的关闭fclose函数文件的打开fopen函数功能打开数据文件。格式 FILE *fopen(文件名,使用文件方式);举例 FILE *fp,*f5; fp=fopen(a1, r); f0=fopen (a2, rb);打开文件说明用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的输入文件,否则出错。用“w”方式打开的文件只能用于向文

7、件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建一个指定名字的文件。如果原来文件已存在,则打开时删去该文件,然后重新建立一个新文件。如果希望向文件末尾添加新的数据(不希望删除原来数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。用“r+”、“w+”、“a+”方式打开的文件可以输入输出文件。“r+”:输入数据时,要求原来文件存在。“w+”:新建一个文件,先向此文件写数据,然后读此文件中的数据。“a+”:原文件不删除,在文件末尾添加。 如果不能实现“打开”的任务,fopen函数将会返回一个出错信息NULL。

8、例如:文件不存在,磁盘出故障,磁盘满等。 fp=fopen(file1, r); fp的值为null,即为0。 目前使用的有些C编译系统可能不完全支持所有这些功能,只支持一部分:有些只支持“r”、“w”、“a”;有的C编译系统不用“r+”、“w+”、“a+”,而是用:“rw”、“wr”、“ar”。 在向计算机输入文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换为回车和换行两个字符。在用二进制文件时,不进行这种转换。在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。文件使用方式表文件使用方式含 义 r(只读)为输入打开一个文本文件 w(只写)为输出打开一个文本文件

9、a(追加)向文本文件尾追加数据 rb(只读)为输入打开一个二进制文件 wb(只写)为输出打开一个二进制文件 ab(追加)向二进制文件尾追加数据 r+(读写)为读/写打开一个文本文件 w+(读写)为读/写建立一个新的文本文件 a+(读写)为读/写打开一个文本文件 rb+(读写)为读/写打开一个二进制文件 wb+(读写)为读/写建立一个新二进制文件 ab+(读写)为读/写打开一个二进制文件文件的关闭fclose函数功能关闭数据文件,将缓冲区中数据写入数据文件,如不关闭,缓冲区中数据丢失。同时将缓冲区归还系统。格式 int *fclose(fp);举例 FILE *fp; fp=fopen(a1,

10、r); fclose(fp);其中:fp为打开该文件所得的文件指针。文件关闭的说明 在向磁盘写数据时,首先将数据写到缓冲区;当缓冲区满时,将缓冲区中数据写到磁盘上。因而当不关闭文件而退出程序时,缓冲区中数据可能丢失。 在使用完某个文件时,如不关闭,有可能被误操作,因而在使用完文件时,关闭该文件。 关闭文件后,再不能访问该文件,如果想访问该文件,可重新打开该文件。 fclose函数返回一个整数。当顺利地执行关闭操作,则返回值为0,否则返回-1。 文件使用完后,必须关闭文件。因为打开的每一个文件都对应一个文件缓冲区,缓冲区数量有限,如不关闭文件,即不归还缓冲区,就会浪费掉文件缓冲区的资源。标准IO

11、及其重定向标准IO输出重定向标准IO在程序开始运行时,系统自动打开三个标准文件:标准输入标准输出标准错误输出stdin指针变量指向stdout指针变量指向stderr指针变量指向标准输入指的是键盘输入。标准输出指的是显示器输出。标准错误输出指的也是显示器输出。标准输入输出文件是指缺省指定的输入输出设备输出重定向当不在标准输入输出文件输入输出时,可指定特定文件进行输入输出。输入重定向: “”从指定文件读取数据,而不是从键盘读取数据。(事先将要输入的数据按顺序写入输入文件)exefile ”将输出数据输出到指定的文件,如文件存在,则先删除该文件中的数据,然后再输出数据到该文件。exefile 输出

12、重定向2: “”将输出数据输出到指定的文件,如文件存在,则在该文件中的末尾追加数据。exefile 同时使用输入输出重定向: exefile 在dos系统中,标准输出设备:显示器的文件名为 con 打印机的文件名为prnexefile con exefile prn文件的读写按字符读写文件按字符读文件按字符写文件按数据块读写文件按格式读写文件按字符读文件fgetc()函数功能从指定文件读入一个字符。要求该文件必须是以读或读写方式打开的。格式 ch=fgetc(fp)其中:fp为文件型指针变量。ch为字符型变量。说明正常情况下,fgetc( )返回一个字符,当读到文件尾时,其返回值为EOF, E

13、OF在stdio.h中定义为-1。EOF不能显示。在用fgetc( )函数读取一个字符后,读指针自动下移一个字符。判断文本文件是否结束,使用EOF,判断二进制文件是否结束,使用feof函数,是因为二进制文件中,-1的值也是-1,无法判断是文件结束,还是值-1。fgetc( )举例文本文件ch=fgetc(fp);while(ch!=EOF) putchar(ch); ch=fgetc(fp); 二进制文件while(! feof(fp) ch=fgetc(fp); putchar(ch); 按字符写文件功能把一个字符写到指定的磁盘文件上去。格式 fputc(ch, fp);其中:fp为文件型指

14、针变量。ch为要输出的字符,可以是一个常量, 也可以是字符变量。说明 正常情况下,fputc( )返回一个值,当输出成功时,其返回值为输出的字符,否则返回一个EOF(-1),在stdio.h中定义为符号常数,值为-1。程序举例1从键盘输入一些字符,逐个将它们送到磁盘上去,直到输入一个“”为止。#include main( )FILE *fp; char ch, 10; scanf(%s, ); if(fp=fopen(, w)=NULL) printf(cannot open filen); exit(0); ch=getchar( ); while(ch!=#) fputc(ch, fp);

15、 putchar(ch); ch=getchar( ); fclose(fp); 程序举例2下面程序用变量count统计文件中字符的个数。请在 处填入适当的内容。#include main( )FILE *fp; long count=0; if (fp=fopen(letter.dat, _)=NULL) printf(cannot open filen); exit(0); while(!feof(fp)_; _;) printf(count=%ldn, count); fclose(fp);rfgetc(fp)count+按数据块读写文件用fgetc( )和fputc( )只能输入输出文

16、件中的一个字符。当要输入输出一组数据(例如一个实数、一个结构体变量等)时,可用ANSI C的缓冲文件系统中的fread、fwrite两个函数。文件如果以二进制形式打开,fread和fwrite函数可以读写任何类型的信息。按数据块读取文件fread( )函数按数据块写入文件fwrite( )函数fread( )函数功能从指定文件读入一组数据。格式 fread(buffer, size, count, fp);其中:fp为文件型指针变量。buffer为指针变量,是读入数据的 读入地址。 size为读取的数据类型字节数。 count为要进行读取多少个size字节 的数据项。举例 bloat f2;

17、fread(f, 4, 2, fp); 一个单精度俘点变量占个字节,这个函数从fp文件中读取2次 (每次个字节)数据,存储在数组f中。输入成功,则返回count值,即2。fwrite( )函数功能向指定文件输出一组数据。格式 fwrite(buffer, size, count, fp);其中:fp为文件型指针变量。buffer为指针变量,是要输出数据 的首地址。 size为输出的数据类型字节数。 count为要进行输出多少个size字节 的数据项。举例 bloat f2; fwrite(f, 4, 2, fp); 一个实型变量占个字节,这个函数将数组f中的两个实型元素输出到fp文件中。输出成

18、功,则返回count值,即。程序举例3从键盘输入个学生的有关数据,然后将它们转存到磁盘文件上。数据结构struct student_type char name10; int num, age; char addr30; stud4;#include #define SIZE 4;struct student_type char name10; int num, age; char addr15; studSIZE;main( )void save( ); int i; for(i=0; iSIZE;i+) scanf(%s%d%d%s, , &studi.num,&stu

19、di.age, studi.addr); save( );void save( )FILE *fp; int i; if(fp=fopen(stu_list, wb)=NULL) printf(cannot open filen); return; for(i=0; iSIZE; i+) if(fwrite(&studi, sizeof(struct student_type), 1, fp)!=1) printf(file write errorn); fclose(fp);按格式读写文件功能在磁盘文件上有格式地读写一组数据。格式 fscanf(文件指针, 格式, 输入列表); fprint

20、f(文件指针, 格式, 输出列表);举例当i=3, t=4.5 fprintf(fp, %d, %6.2f, i, t); 3, 4.5 fscanf(fp, %d, %6.2f, &i, &t); i=3 t=4.5文件的定位文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符。要改变这个规律,使用下列函数:rewind函数fseek函数ftell函数rewind函数功能将位置指针重新返回文件的首部。格式 rewind(fp);说明 此函数没有返回值。程序举例有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次

21、把它复制到另一个文件上。第一遍输出在屏幕上,第二遍输出在另一文件上。#include main( )FILE *fp1, *fp2; fp1=fopen(, r); fp2=fopen( , w); while(!feof(fp1)putchar(fgetc(fp1); rewind(fp1); while(!feof(fp1)fputc(fgetc(fp1), fp2); fclose(fp1); fclose(fp2);fseek函数功能将位置指针移到任意位置,达到随机读写。格式 fseek(文件指针, 位移量, 起始位置);说明其中:位置指针用、或分别表示 文件开始SEEK_SET 文件当前位置SEEK_CUR 文件末尾SEEK_END位移量是以“起始位置”为基点,向前移动的字节数。使用fseek函数,可以实现随即读写磁盘文件。在ANSI C和大多数C编译要求位移量是long型数据,在大数据文件时,不出问题;ANSI C标准规定在数字的末尾加一个字母L。fseek(fp, 100L, 0);fseek函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往要发生混乱。 fseek(fp, 100L, 0); 文件头100字节 fseek(fp, 50L, 1); 当前位置50字节 fseek(fp, -10L, 2); 文件尾10字节ftell函数功能得到流式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论