最新文件处理(C语言)_第1页
最新文件处理(C语言)_第2页
最新文件处理(C语言)_第3页
最新文件处理(C语言)_第4页
最新文件处理(C语言)_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、2021-11-6许创制作1上机习题上机习题ch12ex6: 逐个字符输入一个串,将其中的大写字母逐个输出到磁盘文件file.txt中(输入的串以“!”结束,但“!” 不存入文件中)。ch12ex7: 用记事本先创建两磁盘文件:file1.txt和file2.txt各存放一串有序字母,设计程序将这两个文件合并到file3.txt中,要求合并后的串仍然有序。练习: ch12ex8: 磁盘文件student.bin存放10名学生数据(含学号、姓名、总分),现要求输出学号为奇数的学生的记录。2021-11-6许创制作2第第1212章章 文件处理文件处理学习目标学习目标了解文件的基本概念。了解文件的基

2、本概念。熟练掌握文件的打开和关闭方法。熟练掌握文件的打开和关闭方法。熟练掌握对文件的字符读写方法。熟练掌握对文件的字符读写方法。掌握对文件的格式化读写方法。掌握对文件的格式化读写方法。了解二进制文件的读写方法及文件定位。了解二进制文件的读写方法及文件定位。2021-11-6许创制作3l文件是指记录在外部介质上数据的集合。l广义地说,所有输入输出设备都是文件 (如键盘为stdin、显示器为stdout)。l文件的分类(可从三个不同角度来分类) 1)按文件依附的介质区分 2)按文件的内容区分 3)按数据的组织形式区分(文本文件和二进制文件)l一般高级语言都能提供对文本文件和二进制文件的操作,后面将

3、详细介绍。2021-11-6许创制作4l c语言的文件是流式文件,它把数据看作是一连串的字符,即字节流或二进制流。l c语言的文件并非由记录组成。l c语言对文件的存取是以字节为单位,输入输出的数据流的开始和结束仅受程序控制,而不受物理符号控制,输出时不会自动增加回车换行符作为记录结束标志,输入时不以回车换行符作为记录的间隔。 2021-11-6许创制作5n缓冲文件系统和非缓冲文件系统缓冲文件系统和非缓冲文件系统 c所使用的磁盘文件系统分两大类: 1)缓冲文件系统(标准文件系统) 2)非缓冲文件系统(低层文件系统) 缓冲区 为了缓冲cpu和i/o设备之间速度不匹配的矛盾,在内存开辟一 个或多个

4、专用内存区,作为cpu与i/o设备的“集散地”,我们称这种专用内存区为缓冲区 unix系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件2021-11-6许创制作6 缓冲文件系统的特点: 对程序中每个文件都开辟一个缓冲区(输入缓冲区或输出缓冲区),使得从文件输入的数据先送到输入缓冲区,然后再从缓冲区依次将数据送给接收变量。同理,在向磁盘文件输出数据时,先将程序数据区中变量或表达式的值送到输出缓冲区中,待装满缓冲区后才一起输出到磁盘文件。见下面图所示。2021-11-6许创制作7输出缓冲区内存输入缓冲区a磁盘文件程序数据区ab2021-11-6许创制作8l 非缓冲文件系统不由

5、系统自动设置缓冲区,而由用户自己根据需要设置l 本章主要介绍缓冲文件系统l 把缓冲文件系统的输入输出称为标准输入输出(标准i/o)l 而把非缓冲文件系统的输入输出称为系统级输入输出(系统i/o)l 标准i/o提供读写文件的5种方法(c有5种相应函数,总共10个):2021-11-6许创制作91)读、写一个字符:fgetc 和 fputc2)格式化读、写:fscanf 和 fprintf3)读、写一个结构体记录:fread 和 fwrite4)读、写一个字符串*:fgets 和 fputs5)读、写一个整数*:getw 和 putwn文件(文件(file)类型指针)类型指针l 缓冲文件系统的一个

6、关键概念是文件指针l 缓冲文件系统为每一文件开辟一个文件信息区,用于存放各种文件信息,它是一个由系统定义的结构体变量。形式为:2021-11-6许创制作10l 当程序要用到一个文件,系统就为它开辟一个如上结构体变量,存放文件的有关信息。这种结构体变量不用变量名来标识,只需设置一个指向该结构体变量的指针变量,通过它来访问该结构体变量。例: file *fp1, *fp2, *fp3; typedef struct /*结构体成员用来存放文件信息*/ file; 2021-11-6许创制作11l 通过fp1, fp2, fp3就可以访问相应文件的信息区,达到操作有关文件的目的l 可理解为这三个指针

7、指向某三个文件文件1的 信息区文件2的 信息区文件3的 信息区fp1fp2fp3l 定义文件类型指针变量的一般形式: file *文件类型指针变量名文件类型指针变量名; 2021-11-6许创制作12l 对磁盘文件的操作顺序一般是: 1)打开 2)读写 3)关闭 文件的打开l 格式:fopen(文件名,使用方式文件名,使用方式); 例: fopen(file1, r); 通常使用以下方法打开一个文件: if (fp=fopen(file1, r)=null) printf(cannot open this file.n); exit(-1); n文件的打开和关闭文件的打开和关闭2021-11-

8、6许创制作13文件使用方式(表12-1):r 只读w 只写a 追加rb 只读wb 只写 ab 追加r+ 读写w+ 读写a+ 读写rb+ 读写wb+ 读写ab+ 读写l 说明:“r”方式打开的文件必须已经存在;“w”方式打开就是新建文件;“a”方式打开则是从文件尾添加数据;“b”是二进制 2021-11-6许创制作14文件的关闭l 格式:fclose(文件指针变量文件指针变量); 例: fclose(fp); 不关闭文件而结束程序运行,往往会由于留在缓冲区上的数据未写入磁盘而使数据丢失。因此,文件使用完之后一定要关闭。n文件的顺序读写文件的顺序读写 输入和输出一个字符(fgetc和fputc)l

9、 输出字符到磁盘文件:fputc(ch, fp);l 从磁盘文件读入字符:ch=fgetc(fp);2021-11-6许创制作15【例【例12-1】输入字符存到磁盘直至遇】输入字符存到磁盘直至遇#为止为止 1)为写准备而打开文件; 2)当键入的字符不是#,循环做: 将键入的字符送到磁盘文件; 3)关闭文件。l 顺序读模式1:ch=fgetc(fp);while(ch!=eof) putchar(ch); ch=fgetc(fp);l 顺序读模式2:while(!feof(fp) ch=fgetc(fp); putchar(ch); 2021-11-6许创制作16#include stdlib.

10、hvoid main()file *fp; char ch; if(fp=fopen(k:file1.c, w)=null) printf(cannot open file.n); exit(-1); while(ch=getchar()!=#) fputc(ch, fp); /* 逻辑上输出一个字符 */ putchar(ch); /* 屏幕显示 */ fclose(fp);或:fputc(ch, stdout);或:return; 输入: you are happy.#2021-11-6许创制作17【例【例12-2】从磁盘文件读入字符并显示】从磁盘文件读入字符并显示#include std

11、lib.hvoid main() file *fp; char ch; if(fp=fopen(k:file1.c, r)=null) printf(cannot open file.n); exit(-1); while(ch=fgetc(fp)!=eof) putchar(ch); /* 屏幕显示 */ fclose(fp); 输出: you are happy.2021-11-6许创制作18【例【例12.1】文件复制程序(编译成】文件复制程序(编译成.exe文件文件后,其功能相似于后,其功能相似于dos命令命令copy)算法描述:(将第一个文件复制给第二个文件) 1)输入两个文件名; 2

12、)为读而打开已有的第一个文件; 3)为写而打开第二个文件; 4)当第一个文件尚未结束,循环做: 将当前字符送第二个文件; 5)关闭两个文件。 2021-11-6许创制作19void main() /* 缺缺include */file *in,*out; char ch,infile10,outfile10; printf(enter filename1:); gets(infile); printf(enter filename2:); gets(outfile); in=fopen(infile, r); out=fopen(outfile, w); while(!feof(in) ch=

13、fgetc(in); fputc(ch, out); fclose(in); fclose(out); 简化文件打开,但一般不提倡! 显示与输入: enter filename1:file1.c enter filename2:file2.c2021-11-6许创制作20 格式化输入和输出(fscanf和fprintf)l 格式化写:fprintf(fp, 串串, 输出表列输出表列);l 格式化读:fscanf(fp, 串串, 输入表列输入表列);【例【例12.2】写格式化数据(若干名学生的姓】写格式化数据(若干名学生的姓名、学号、成绩)到磁盘文件名、学号、成绩)到磁盘文件算法描述: 1)为写

14、而打开文件; 2)当键盘输入的一组数据不是ctrl+z, 循环做:将该组数据格式化写到文件; 3)关闭文件。 2021-11-6许创制作21void main( ) /* 缺缺#include */file *fp; char name20; int num; float score; fp=fopen(file.txt,w); printf(type name num score:); while(scanf(%s%d%f,name,&num,&score) !=eof) fprintf(fp,%s %d %f, name,num,score); printf(type na

15、me num score:); fclose(fp);按ctrl+z 显示与输入: type name num score:bob 301 86 type name num score:sam 302 75 type name num score:z2021-11-6许创制作22【例【例12.3】从磁盘文件读入格式化数据并显示】从磁盘文件读入格式化数据并显示void main( ) /* 缺缺#include */file *fp; char name20; int num; float score; if(fp=fopen(file.txt, r)=null) printf(cannot o

16、pen file); return; while(fscanf(fp, %s %d %.1f, name, &num, &score)!=eof) printf(%s %d %.1fn, name, num, score); fclose(fp); 输出: bob 301 86.0 sam 302 75.0 2021-11-6许创制作23 二进制文件的读写 (fread和fwrite)l fread和fwrite用于读写一组数据(“记录”)l 读入一个结构:fread(buffer,size,count,fp);l 输出一个结构:fwrite(buffer,size,count

17、,fp);l 其中: buffer是指针,表示读入/输出数据的始址 size是要读写的字节数 count是要读写多少个size字节的数据项 fp是文件型指针 【例【例12-5】输入】输入4个学生数据并存放到磁盘个学生数据并存放到磁盘2021-11-6许创制作24struct student /* 缺缺#include */long num; char name8; int age; char sex2; st1; void main()file *fp; int i; fp=fopen(data.bin, wb); for(i=0;i4;i+) scanf(%ld%s%d%s, st1.num

18、, &, &st1.age, st1.sex); /*键盘输入*/ if(fwrite(&st1,16,1,fp)!=1) printf(error); fclose(fp); 简化文件打开,但一般不提倡!一般用sizeof计算 输入: 2010111001 bob 20 m 2010111002 lili 19 f 2010111003 sam 19 m 2010111004 jone 20 m2021-11-6许创制作25【例【例12-6】从磁盘文件读入所有数据并显示】从磁盘文件读入所有数据并显示struct student /* 缺缺#includ

19、e */long num; char name8; int age; char sex2; st1; void main()file *fp; fp=fopen(data.bin, rb); while(!feof(fp) fread(&st1, 16, 1, fp); printf(%ld %8s%3d%2sn,st1.num, , st1.age, st1.sex); /* 屏幕显示 */ fclose(fp); 输出: 2010111001 bob 20 m 2010111002 lili 19 f 2010111003 sam 19 m 2010111004 j

20、one 20 m2021-11-6许创制作26 输入和输出一个整数* (getw和putw)【例【例12.4】将】将0-9整数存盘,再读入内存并显示整数存盘,再读入内存并显示void main() /* 缺缺include */file *fp; int i; fp=fopen(abc.txt, w); for(i=0;i0) /*非空串非空串*/ fputs(str, fp); fputs(n, fp); fclose(fp);或:fputc(n, fp); 输入: we are chinese. we love china. 2021-11-6许创制作28【例【例12.6】从磁盘文件读回字

21、符串并显示从磁盘文件读回字符串并显示#includestdio.h#includestdlib.hvoid main()file *fp; char str81; fp=fopen(file2.txt, r); while(fgets(str, 81, fp)!=null) printf(%s, str); fclose(fp); 输出: we are chinese. we love china.2021-11-6许创制作29n文件的随机读写文件的随机读写 文件指针复位函数: rewind(文件型指针文件型指针); 其作用是使指针重返文件起始处 文件定位函数(定位成功则返回0): fseek

22、(文件型指针文件型指针, 位移量位移量, 起始点起始点); 其中,位移量(字节数)取值为: 正值顺向移动、负值逆向移动 起始点取值为: 0文件头、1当前位置、2文件尾 2021-11-6许创制作30【例【例12.7】将磁盘文件上的内容显示出来,】将磁盘文件上的内容显示出来,再将其复制到另一文件上再将其复制到另一文件上void main( ) /* 缺缺#include */file *fp1, *fp2; fp1=fopen(file1.c, r); fp2=fopen(file2.c, w); while(!feof(fp1) putchar(getc(fp1); rewind(fp1); while(!feof(fp1) putc(getc(fp1), fp2); fclose(fp1); fclose(fp2); 输出: you are happy.2021-11-6许创制作31【例【例12-7】显示【例】显示【例12-5】存入的第】存入的第3个学生信息个学生信息struct student /* 缺缺#include */ long num; char name10; int age; char sex2; stu; void main()file *fp; fp=fopen(data.bin, rb);

温馨提示

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

最新文档

评论

0/150

提交评论