电脑编程培训教材 文件_第1页
电脑编程培训教材 文件_第2页
电脑编程培训教材 文件_第3页
免费预览已结束,剩余35页可下载查看

下载本文档

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

文档简介

1、第12章:文 件,学习的意义,C语言执行程序,输入数据,存在问题:运行完毕, 结果消失!,运行结果能否长期保存呢?,使用文件!,文件无处不在,切不可视而不见,时而不理!,如:C语言源程序文件(.c或.cpp)、执行文件(.exe)、图片文件(.jpg),学习目标,学习内容,文件的基本概念 文件的类别 文件操作概述 文件指针 文件的打开、读写和关闭 文件的打开与关闭 文件的读写 文件读写函数选用原则 文件的定位读写 文件应用综合举例 本章小结,理解文件的概念 正确把握文本文件与二进制文件的区别; 掌握文件的打开、读写、定位以及关闭的方法; 掌握文件系统中有关文件操作的系统函数使用方法; 能设计对

2、文件进行简单处理的实用程序;,12.1 文件的基本概念,文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。,使用数据文件的目的: 数据文件的改动不引起程序的改动程序与数据分离 不同程序可以访问同一数据文件中的数据数据共享 能长期保存程序运行的中间数据或结果数据,文件命名规则: 为标识一个文件,每个文件都必须有一个文件名,其一般结构为:主文件名.扩展名 文件命名规则,遵循操作系统的约定。例如,一个C语言源程序名为:prg.c,12.2 文件的类别,按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:

3、存储介质文件(磁盘、磁带等) 设备文件:非存储介质(键盘、显示器、打印机等) 按文件的内容 程序文件。程序文件又可分为源文件、目标文件和可执行文件。 数据文件。如各种图像文件、声音文件等。 根据文件的组织形式 顺序存取文件; 随机存取文件。 按数据的组织形式: 文本文件: ASCII文件,每个字节存放一个字符的ASCII码 二进制文件:数据按其在内存中的存储形式原样存放,short int 数据32767,32767的各字符的ASCII码存放形式,内存存放形式,文本文件特点: 存储量大、速度慢、便于对字符操作,二进制文件特点: 存储量小、速度快、便于存放中间结果,12.3 文件操作概述,读文件

4、与写文件,读文件:将磁盘文件中的数据传送到计算机内存的操作。 写文件:从计算机内存向磁盘文件中传送数据的操作。,构成文件的基本单元与流式文件,语言将文件看作是由一个一个的字符(ASCII码文件)或字节(二进制文件)组成的。文件中不存在其它更复杂的数据类型和结构,对文件数据的解释完全看程序本身。我们把按这种方式处理的文件称为流式文件。而在其它高级语言中,组成文件的基本单位是记录,对文件操作的基本单位也是记录。C语言程序也可以按照操作系统的方式操作文件,本章只介绍流式文件的操作方法。 C语言本身没提供输入输出的功能,必须调用标准库函数进行文件读写。,文件处理方法 缓冲文件系统:高级文件系统,系统自

5、动为正在使用的文件开辟内存缓冲区 非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区,12.4 文件指针,文件结构体FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区 文件信息用系统定义的名为FILE的结构体描述 FILE定义在stdio.h中(Borland C+ 3.1),typedef struct int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold;

6、 /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char _FAR *buffer; /* Data transfer buffer */ unsigned char _FAR *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ FILE; /* This is the FILE object */

7、,文件类型指针 指针变量说明: FILE *fp; 用法: 文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件 文件关闭后,它的文件结构体被释放,12.5 文件的打开、读写和关闭,1、文件的打开与关闭,打开文件fopen,FILE *fopen (char *filename, char *mode);,C文件操作用库函数实现,包含在stdio.h 文件使用方式:打开文件-文件读/写-关闭文件 系统自动打开和关闭三个标准文件:,标准输入-键盘 stdin 标准输出-显示器 stdout 标准出错输出-显示器 stderr,函数原形:,要打开的文件

8、名,打开文件方式,功能:按指定方式打开文件 返值:正常打开,为指向文件结构体的指针;打开失败,为NULL,打开文件方式mode由两类字符构成: 一类字符表示打开文件的类型 t-表示文本文件(text,默认方式), b-表示二进制文件(binary), 另一类字符是操作类型 r-表示从文件中读取数据(read), w-表示向文件写入数据(write), a-表示在文件尾追加数据(append), +-表示文件可读可写。,注意: 打开文件方式字符串mode其字符先后次序是:操作类型符在前,打开文件类型符在后。如,rb、wt,不可写成br、tw。而对于+来说,可以放在操作类型符的右边,也可放在字符串

9、的最后,但不可放在操作类型符的左边。如,w+b或wb+都是正确的,而+wb则是错误的。,例: FILE *fp; fp = fopen (wang.txt, r); if (fp = = NULL) printf (the file :wang.txt not found! ); exit (-1); ,打开文件fopen,int *fclose (FILE *filepointer);,函数原形:,文件打开时返回的文件类型指针,功能:关闭filepointer指向的文件 返值:正常关闭为0;出错时,非0 作用: 使文件指针变量与文件“脱钩”,释放文件结构体和文件指针,不关闭文件可能会丢失数据

10、,FILE *fp; fp = fopen (wang.txt, r+); if (fp = = NULL) printf (the file :wang.txt not found! ); exit (-1); /读取和加工数据 fclose (fp); /关闭该文件,2、文件的读写,在语言中提供了多种文件读写的函数,这些函数主要包括: 字符读写函数: fgetc 和 fputc 字符串读写函数:fgets 和 fputs 数据块读写函数:fread 和 fwrite 格式化读写函数:fscanf 和 fprinf,(1) 字符读写函数:fgetc 和 fputc,fgetc,函数原形:,i

11、nt fgetc (FILE *filepointer);,功能:从filepointer指向的文件中,读入一个字节(字符),同时将读写位置指针向前移动1个字节(即指向下一个字符) 返值:正常,返回读到的代码值;读到文件尾或出错,为EOF,fputc,函数原形:,int fputc (int c, FILE *filepointer);,功能:将字符数据c输出到filepointer所指向的文件中去,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。 返值:正常,返回c;出错,为EOF,【例1】 将键盘上输入的一个字符串(以作为结束字符),以ASCII码形式存储到一个磁盘文件中,然后

12、从该磁盘文件中读出其字符串并显示出来。,#include #include void main (int argc, char *argv ) FILE *fp1,*fp2; char ch; if (argc != 2) /参数个数不对 printf (the number of arguments not correctnn); printf (Usage: 可执行文件名 filename n); exit (0); if (fp1 = fopen(argv1,wt) = NULL) /打开文件失败 printf (can not open this filen); exit (0); ,

13、/输入字符,并存储到指定文件中 for ( ; (ch = getchar( ) != ; ) fputc (ch, fp1); /输入字符并存储到文件中 fclose (fp1); /关闭文件 /顺序输出文件的内容 fp2 = fopen (argv1, rt); for (; (ch = fgetc(fp2) != EOF; ) putchar (ch); /顺序读入并显示 fclose (fp2); /关闭打开的文件 ,运行结果(假设在DOS下输入的命令行如下): example1 wang.txt How are you? How are you?,【例2】利用字符读写函数实现文件拷贝

14、。,#include #include void main (int argc, char *argv ) /input:源文件指针, output:目标文件指针 FILE *input, *output; if (argc != 3) /参数个数不对 printf (the number of arguments not correctn); printf (n Usage: 可执行文件名 source-file dest-file); exit (0); /打开源文件失败 if (input = fopen(argv1, r) = NULL) printf (can not open so

15、urce filen); exit (0); ,/创建目标文件失败 if (output = fopen(argv2,w) = NULL) printf (can not create destination filen); exit (0); /复制源文件到目标文件中 for ( ; ( !feof(input) ) ; ) fputc (fgetc(input), output); fclose (input); /关闭源文件 fclose (output); /关闭目标文件 ,文件读写位置指针:,在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一

16、个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。,文件读写位置指针与文件指针的区别:,文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。 文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。, ,(2) 字符串读写函数:fgets 和 fputs,fgets,函数原形:,char *fgets (char *s, int n, FILE *filepointer);,功能:从filepointer所指向的文件读取一字节串 返值:

17、正常,返回读取的字符串的指针;出错或文件尾,则返回NULL。,从filepointer所指文件读n-1个字符送入s指向的内存区, 并在最后加一个0 (若读入n-1个字符前遇换行符或文件尾(EOF)即结束),fputs,函数原形:,int fputs (char *s, FILE *filepointer);,功能:将存放在s中的字符串写到文件指针filepointer所指向的文件中去,同时将读写位置指针向前移动字符串长度个字节。 返值:正常时返回写入的最后一个字符;出错为EOF。,不会将字符串结尾符0写入文件,也不会自动向文件写入换行符,如果需要写入一行文本,s字符串中必须包含n。,#incl

18、ude #include void main ( ) FILE *fp1, *fp2; char str = 123456789; /创建文本文件wang.txt fp1 = fopen (wang.txt, w); if (fp1 = = NULL) /创建文件失败 printf (can not open file: wang.txtn); exit (0); /将字符串“12345678”写入文件 fputs (str, fp1); /写入第一行文本的换行符和下一行文本 fputs (nabcd, fp1); fclose (fp1); /关闭文件,【例3】向文件wang.txt中写入两

19、行文本,然后分三次读出其内容。,31 32 33 34 35 36 37 38 39,0D 0A 61 62 63 64,fp2 = fopen (wang.txt, rt); /以只读方式打开wang.txt文件 fgets (str, 8, fp2); /读取字符串,最大长度是7,将是1234567 printf (%sn, str); fgets (str, 8, fp2); /读取字符串,最大长度是7,实际上将是89n printf (%sn, str); fgets (str, 8, fp2); /读取字符串,最大长度是7,实际上将是abcd printf (%sn, str); f

20、close (fp2); /关闭打开的文件 ,运行结果: 1234567,89,abcd,#include #include void main (int argc, char *argv ) /input:源文件指针, output:目标文件指针 FILE *input, *output; char string81; if (argc != 3) /参数个数不对 printf (the number of arguments not correctn); printf (n Usage: 可执行文件名 source-file dest-file); exit (0); /打开源文件失败 i

21、f (input = fopen(argv1,r) = NULL) printf (can not open source filen); exit (0); ,【例4】利用字符串读写函数实现文件拷贝。,/创建目标文件失败 if (output = fopen(argv2,w) = NULL) printf (can not create destination filen); exit (0); /复制源文件到目标文件中 while (fgets(string, 81, input) != NULL) fputs (string, output); fclose (input); /关闭源文

22、件 fclose (output); /关闭目标文件 ,(3) 数据块读写函数:fread 和 fwrite,fread,函数原形:,unsigned fread (void *ptr, unsigned size, unsigned n, FILE *filepointer);,功能:从filepointer所指向的文件中读取n个数据项,每个数据项的大小是size个字节,这些数据将被存放到ptr所指向的内存中。同时,将读写位置指针向前移动n*size个字节。 返值:如果操作成功,则函数返回值就是读取的数据项的个数(不是字节的个数);如果操作出错或遇到文件尾,则返回0。,(3) 数据块读写函数

23、:fread 和 fwrite,fwrite,函数原形:,unsigned fwrite (void *ptr, unsigned size, unsigned n, FILE *filepointer);,功能:将ptr所指向的内存中存放的n个大小为size个字节的数据项写入到filepointer所指向的文件中,实际要写入数据的字节数是n*size。同时,将读写位置指针向前移动n*size个字节。 返值:如果操作成功,则函数返回值就是实际写入的数据项的个数(不是字节的个数);如果操作出错,则返回0。,注意:fread和fwrite一般用于二进制文件的输入和输出,#include #incl

24、ude #include void main ( ) FILE *fp; short i, a10 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; /创建二进制文件wang.dat fp = fopen (wang.dat, wb); if (fp = = NULL) /创建失败 printf (can not create file: wang.txtn); exit (0); /将数组a的10个整型数写入到文件中 fwrite (a, sizeof(short), 10, fp); fclose (fp); /关闭文件,/以读的打开二进制文件wang.dat fp = fo

25、pen (wang.dat, rb); if (fp = = NULL) /打开失败 printf (can not open file: wang.datn); exit (0); /将数组a的10个元素清0 memset (a, 0, 10*sizeof(short); /从文件中读取10个整型数据到数组a fread (a, sizeof(short), 10, fp); fclose (fp); /关闭文件 for (i = 0; i 10; i+) /显示数组a的元素 printf (%d , ai); ,运行结果: 0 1 2 3 4 5 6 7 8 9,【例5】将一个整型数组存放

26、到文件中,然后从文件中读取数据到数组中并显示。,#include #include #include struct student_info char no9; char name10; char sex; int age; char address20; ; typedef struct student_info STUINFO; void WriteToFile (STUINFO *pstu, int num); void ReadFromFile (STUINFO *pstu, int num);,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,

27、void main ( ) int i, num; STUINFO *pstu; /输入学生人数 printf (input the number of students: ); scanf (%d, ,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,for (i = 0; i num; i+) /输入学生信息 printf (the %dth student: no = , i+1); gets (pstui.no); fflush (stdin); printf (the %dth student: name = , i+1); gets (pst

28、); fflush (stdin); printf (the %dth student: sex = , i+1); scanf (%c, ,/将pstu所指向的学生信息写入文件中 WriteToFile (pstu, num); /将pstu所指向的内存块清0 memset (pstu, 0, num * sizeof(STUINFO); /从文件中读取学生信息到pstu所指向的内存块中 ReadFromFile (pstu, num); /显示学生信息 printf (%10s%12s%6s%5s%20sn,no,name, sex,age,address); for (i

29、= 0; i num; i+) printf (%10s%12s%6c%5d%20sn, pstui.no, , pstui.sex, pstui.age, pstui.address); free (pstu); /释放动态分配的内存 ,【例6】将多个学生的基本信息存放到student.dat文件中,然后从文件中读出并显示。,/将pstu所指向的学生信息写入文件student.dat中 void WriteToFile (STUINFO *pstu, int num) FILE *fp; fp = fopen (student.dat, wb); if (fp = = N

30、ULL) printf (cant create student.datn); free (pstu); exit (0); fwrite (pstu, sizeof(STUINFO), num, fp); fclose (fp); ,/从文件student.dat中读取学生信息 到pstu所指向的内存块中 void ReadFromFile (STUINFO *pstu, int num) FILE *fp; fp = fopen (student.dat, rb); if (fp = = NULL) printf (cant open student.datn); free (pstu);

31、 exit (0); fread (pstu, sizeof(STUINFO), num, fp); fclose (fp); ,(4) 格式化读写函数:fscanf 和 fprinf,fscanf,函数原形:,int fscanf ( FILE *filepointer, const char *format,address,);,功能:从filepointer所指向的文件中读取数据。 返值:如果操作成功,则函数返回值就是读取的数据项的个数;如果操作出错或遇到文件尾,则返回EOF。,fprintf,函数原形:,int fprintf ( FILE *filepointer, const ch

32、ar *format,address,);,功能:将表达式输出到filepointer所指向的文件中。 返值:如果操作成功,则函数返回值就是写入到文件中数据的字节个数;如果操作出错,则返回EOF。,例如: fprintf (fp, %d,%6.2f, i, t); /将i和t按%d, %6.2f格式输出到fp文件 fscanf (fp, %d,%f, /若文件中有3, 4.5,则将3送入i,4.5送入t,#include #include void main ( ) int i = 3; float f = (float)9.8; FILE *fp; /创建文本文件wang.txt fp =

33、fopen (wang.txt, w); if (fp = = NULL) /创建失败 printf (cant create file: wang.datn); exit (0); /将变量i和f的值格式化输出到文件中 fprintf (fp, %2d,%6.2f, i, f); fclose (fp); /关闭文件,【例7】将变量的值格式化写入文件中,然后从文件中格式化读出并显示。,20 33 2C 20 20 39 2E 38 30,/以读的方式打开文件wang.txt fp = fopen (wang.txt, r); if (fp = = NULL) /打开失败 printf (ca

34、nt open file: wang.datn); exit (0); i = 0; /i清0 f = 0; /f清0 /从文件中读取数值到变量i和f fscanf (fp, %d,%f, ,运行结果: i = 3, f = 9.80,注意:文件格式化输出函数fprintf总是以字符串的形式将数据信息存放到文件中,而不是以数值的形式存放到文件中,不管打开的是文本文件还是二进制文件。,3、文件读写函数选用原则,读/写1个字符(或字节)数据时:选用fgetc( )和fputc( )函数。 读/写1个字符串时:选用fgets( )和fputs( )函数。 读/写1个(或多个)不含格式的数据时:选用f

35、read( )和fwrite( )函数。 读/写1个(或多个)含格式的数据时:选用fscanf( )和fprintf( )函数。,对使用文件类型的要求: fgetc( )和fputc( )函数主要对文本文件进行读写,但也可对二进制文件进行读写; fgets( )和fputs( )函数主要对文本文件进行读写,对二进制文件操作无意义; fread( )和fwrite( )函数主要对二进制文件进行读写,但也可对文本文件进行读写; fscanf( )和fprintf( )函数主要对文本文件进行读写,对二进制文件操作无意义。,12.6 文件的定位读写,几个概念,文件位置指针-指向当前读写位置的指针 读写

36、方式,顺序读写:位置指针按字节位置顺序移动,叫 随机读写:位置指针按需要移动到任意位置,叫,rewind,函数原形:,void rewind (FILE *filepointer);,功能:将filepointer所指向的文件的位置指针重新置回到文件的开头。 返值:无,fseek,函数原形:,int fseek(FILE *filepointer, long offset, int whence),功能:改变文件位置指针的位置 返值:成功,返回0;失败,返回非0值,文件指针,位移量(以起始点为基点,移动的字节数) 0 向后移动 0 向前移动,起始点 文件开始 SEEK_SET 0 文件当前位置

37、 SEEK_CUR 1 文件末尾 SEEK_END 2,ftell,函数原形:,long ftell (FILE *filepointer),功能:返回位置指针当前位置(用相对文件开头的位移量表示) 返值:成功,返回当前位置指针位置;失败,返回-1L,【例8】磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示。,#include #include #include struct student_info char no9; char name10; char sex; int age; char depart15; stu3 = 0001, WangFei, M, 18, Compute

38、r, 0002, ZhangMin, M, 19, Math, 0003, LiYan, F, 19, English ;,void main ( ) int i; FILE *fp; /以读写方式打开二进制文件 fp = fopen (student.dat, wb+); if (fp = = NULL) /打开失败 printf (cant create file: student.datn); exit (0); /将学生信息写入到文件中 fwrite (stu, sizeof(struct student_info), 3, fp);,rewind (fp); /将文件位置指针置回到文

39、件头 memset (stu, 0, 3*sizeof(struct student_info); /清除学生信息 /读第1和第3个学生的信息到结构数组stu中 for (i = 0; i 3; i += 2) /文件位置指针定位 fseek (fp, i*sizeof(struct student_info), SEEK_SET); /读取一个学生的信息 fread ( /关闭文件 ,运行结果: 0001 WangFei M 18 Computer 0003 LiYan F 19 English,【例9】求文件的长度。,#include #include void main (int argc, char *argv ) FILE *fp; long length; if (argc != 2) /命令行参数有误 printf (Useage: 执行文件名 filenamen); exit (0); ,fp = fope

温馨提示

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

评论

0/150

提交评论