页数:44页文件大小:456.0 KB来源: C语言程序设计ppt课件
本课件先说明使用数据文件的目的、文件分类与文件类型指针,随后讲解文件的打开与关闭、按字符与字符串、按格式以及按数据块读写文件的标准函数,最后给出文件定位与出错检测函数的使用方法及用好文件的注意事项。
第9章 文件
指针类型2.打开和关闭3.输入输出函数9.3用好文件要点9.4小结结束教学内容教学要求1.了解文件的概念2.了解文件类型指针的定义和含义3.掌握文件操作的相关标准函数4.了解文件定位的操作及相关的标准函数5.了解出错检测函数的作用
第八章 概述
(P184)文件是程序设计语言的重要内容,在很多语言中都有关于文件操作的专门语句,这方面,C语言与其他程序设计语言截然不同:C语言没有单独的文件操作语句,有关文件的操作均是通过库函数进行的。
因此,文件内容的学习方法,是在明确文件的基本概念之后,学习和掌握与文件有关的库函数。
9.1 文件的基本概念
什么叫文件?
文件是具有名字、存储于外存的数据的集合。
计算机所有的数据和程序都以文件的形式保存在外存上。
文件具有驻留性和长度的可变性,它是操作系统能够独立进行存取的最小单位。
操作系统是怎么对文件进行管理的?
通过目录将文件组织成树状结构来实现的,目录是子目录和文件的集合,用户对文件、目录的操作通过目录和文件名字实现。
每个文件或目录必须有且只有一个惟一的名字,包括盘符名、路径、主文件名和文件扩展名4部分信息。
9.1 文件的基本概念
文件的按名存取如果想使用存储在外部介质中的数据,必须根据文件名,在目录结构中找到所需的文件,再从该文件中读取数据。
要将数据保存到外存中,也必须先建立一个文件,才能向它输出数据。
9.1 文件的基本概念
操作系统的观点输出输入的对象是文件,操作系统一般采用统一的观点,把所有与输入输出(简称IO)有关的操作对象统一到“文件”概念里,程序都通过文件来实现,各种标准设备(如键盘、显示器和打印机等)、其他IO设备等也看作文件(叫设备文件),甚至给它们确定了“文件名”。
9.1 文件的基本概念
9.1 文件的基本概念
整数12345在内存中的表示0011000000111001(高字节)(低字节)文本文件0011010100110100001100110011001000110001('5')('4')('3')('2')('1')二进制文件0011000000111001用二进制输出用文本形式输出二进制文件特点:存储量小(占2个字节)、速度快(不需转换)、便于存放中间结果、不可视文本文件特点:存储量大(占5个字节)、速度慢(需要转换)、便于对字符操作、可视
9.1 文件的基本概念
C语言文件存储方式“流”是指一串连续的信息序列,即文件格式用字节解释,在字符之间不会自动插入间隔符。
从逻辑结构上,C语言把文件看作是一个字节序列(流式文件)。
根据数据的存储方式,可分为文本文件(字节流)和二进制文件(比特流)。
C语言IO库函数C语言本身没有IO机制,没有与IO有关的关键字或语言结构,但提供了一组IO库函数。
ANSIC把IO作为标准库的一部分,以提高C程序的可移植性。
所有与IO有关的机制都统一于文件操作函数库中,并提供一组标准IO函数。
9.1 文件的基本概念
标准错误流(stderr)通常直接与显示器连接。
对三个文件的操作不需要指定文件指针,也不需要打开文件的操作,因为它们的打开和关闭由系统管理,程序运行的过程中,用户随时可以使用它们进行输入输出操作。
以前用的标准IO操作都是对这些流进行的。
如前面使用的格式化IO等输入输出函数(printf、scanf)均是针对标准输入输出而言的。
9.1 文件的基本概念
缓冲文件系统概念系统自动地为每一个正在使用的文件再内存中开辟一块存储区(数据缓冲区)作为文件与使用数据的中介。
从内存向磁盘输出数据必须先将数据送到缓冲区,装满缓冲区后才一起写到磁盘上。
从磁盘向内存读入数据时,先从磁盘上将数据读入缓冲区,程序再从缓冲区读取数据。
ANSI标准库采用“缓冲式”IO方式。
9.1 文件的基本概念
缓冲区的处理一个文件打开时,系统为创建的文件建立一个缓冲区,文件与程序的数据传递通过这个缓冲区进行。
文件关闭时缓冲区被释放。
缓冲区与外存的数据操作由操作系统完成不需要C程序分入,虽然在程序与外存间有一个缓冲区,但从操作效果看却似乎没有这个中间过程,程序就像是直接在与外存打交道。
缓冲区的大小缓冲区的大小由具体的C版本确定,一般为512字节(一个磁盘扇区的容量,磁盘读写的最小单位)。
9.1 文件的基本概念
C语言文件处理的基本操作文件操作的第一步是建立与文件关联的流,从已有文件中输入数据要创建输入流,向文件输出数据要建立输出流,还可能建立输入输出流。
建立联系(创建流)的操作称作“打开文件”,文件打开后就可以对它进行数据读写的操作。
当文件不再需要时,程序可以切断与文件的联系,撤销对应流,这称为“关闭文件”。
文件处理的基本操作包括流创建(打开文件)、读写(通过流对文件的读和写)、撤销(关闭文件)及其他辅助函数。
9.2 文件
2文件的使用为了能在程序中方便地使用文件,应该使用标准库的文件操作函数,通过建立输入输出流的方式使用文件。
EOF是stdio.h上中定义的宏,它的值是-1,在文件操作中经常用来表示文件操作的结果状态。
9.2 .1文件指针类型
文件指针缓冲文件系统的关键概念是“文件指针”,系统为每一个使用的文件在内存中开辟一个存储区,用于存放文件的有关信息,这些信息用一个结构变量保存,该结构类型的名字是FILE,由系统定义,TurboC在stdio.h文件中定义FILE结构类型。
typedefstruct{ shortlevel;unsignedflags;charfd;unsigned charhold;shortbsize;unsigned char*buffer;unsigned char*curp;unsignedistemp;shorttoken;}FILE;在stdio.h文件中定义FILE结构类型
9.2 .1文件指针类型
系统为每一个打开的文件分配一个区以存放FILE结构,程序通过FILE类型指针建立和文件的联系,进行关于文件的一切操作。
如下例定义了一个文件类型指针中fp:FILE*fp;
一个文件通过打开文件操作与fp建立联系。通过fp,能够访问fp关联的文件,所有关于该文件的读写操作均通过fp完成。
一般地说,每一个文件需要一个指向FILE的指针变量,文件操作使用这个指针变量即可,读者不需要知道FILE结构的具体含义。
9.2 .2文件的打开和关闭
fopen函数的作用按指定方式打开文件,返回FILE指针值。用FILE指针变量接受fopen返回值后,就可以通过指针进行各种文件操作。
fopen(char*fame,char*mode)9.2 .2文件的打开和关闭
含义文件使用方式为输入打开一个文本/二进制文件“r”/ “rb”(只读)为输出打开或建立一个文本/二进制文件“w”/ “wb”(只写)向文本/二进制文件尾追加数据“a”/ “ab”(追加)为读/写打开一个文本/二进制文件“r+”/“rb+”(读写)为读/写建立一个文本/二进制文件“w+”/“wb+”(读写)为读/写打开或建立一个文本/二进制文件“a+”/“ab+”(读写)
用“a+”时,原文件内容保留,位置指针移到文件末尾。对文件可以添加内容,也可读取数据。
对以读方式打开的文件,使用时有特殊规定。文件必须存在,并且只能用于输入,不能用于输出。
用写方式打开的文件,只能用于输出,不能用于输入。如果要打开的文件不存在,则创建该文件;如果存在,先将该文件删去,重新建立一个同名新文件。
用添加方式打开文件,文件必须存在,文件的内容保留。打开文件时,文件位置指针移到文件尾。可在文件尾部继续写入数据。
9.2 .2文件的打开和关闭
fclose函数的作用使文件指针变量不再指向与该文件对应的FILE结构,从而断开与文件的关联。
使用一个文件后应该将其关闭,防止它再被误用。
再次打开文件,可以使原指针指向新的文件。
fclose(FILE*fp)9.2 .2文件的打开和关闭
应该养成在使用文件后关闭文件的习惯一个C程序能同时打开的文件数有限,文件用完后应及时关闭。如果不关闭文件,将会丢失数据。
fopen ("文件名", "r" ) ; if ( fp == NULL){ … } else{ … } fclose(fp)9.2 .3文件的输入
顺序读写指从文件中一个接一个地读写数据,仅当读写了前一个数据后,才能读写下一个数据。顺序读写后,位置指针自动下移一个位置。标准I/O只能进行顺序读写。
随机读写指从文件中读写数据时不考虑数据在文件中的位置,也就是说,可以在文件的任何位置读写。随机读写在读写数据前,需要将文件位置指针移到读写位置。
9.2 .3文件的输入
9.2 .3文件的输入
9.2 .3文件的输入
【补充实例1】从键盘输入字符,逐个存到磁盘文件中,直到输入'#'为止# include<stdio.h>
main ( ){ FILE*fp; char ch,*filename = "out.txt" ; if (( fp=fopen ( filename,"w" )) == NULL ){ printf ( "cannot open file\n " ); exit (0); } printf ( "Please input string:" ); ch = getchar ( ) ; while ( ch!='#' ){ fputc(ch, fp); putchar(ch); ch = getchar ( ); } fclose ( fp ); }9.2 .3文件的输入
对于文本文件,文件的结束判断通过检查读入字符是否为文件结尾标志EOF即可;(当然也可以使用feof函数)。
对于二进制文件,必须使用feof函数。
因为在二进制文件中,EOF(-1)也是合法的二进制数,如果用EOF来判断的话,可能会造成文件未结束就被认为是结束的错误。
9.2 .3文件的输入
main ( ){ FILE*fp; char ch,*filename = "out.txt" ; if ( ( fp = fopen ( filename, "r" ) ) == NULL ){ printf ( "cannot open file\n" ) ; exit(0); } while ( (ch = fgetc (fp)) !=EOF)putchar(ch); fclose(fp); }9.2 .3文件的输入
main ( ){ FILE*in,*out; char ch, infile[10], outfile[10]; scanf ( "%s", infile); scanf ( "%s", outfile) ; if( (in = fopen ( infile, "r" )) == NULL){ printf ( "Cannot open infile.\n" ); exit(0); } if( (out = fopen ( outfile, "w") ) == NULL){ printf ( "Cannot open outfile.\n" ); exit(0); } while( !feof (in) )fputc ( fgetc ( in ), out ); fclose (in); fclose (out); }9.2 .3文件的输入
函数原型int fread (void*buffer,int size,int count,FILE*fp)int fwrite (void*buffer,int size,int count,FILE*fp)
9.2 .3文件的输入
# include<stdio.h># define SIZE 2struct student_type{ char name[10];int num;int age;char addr[15];} stud[SIZE];
main ( ){ int i; for ( i = 0; i<SIZE; i++ )scanf ( "%s%d%d%s", stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr); save ( ); display ( ); } void save ( ){ FILE*fp; int i, stu_size ; stu_size = sizeof ( struct student_type ); if ((fp = fopen ( "stu_dat","wb" ))== NULL){ printf ( "cannot open file\n" ); return; } for ( i = 0; i<SIZE; i++ )if (write ( &stud[i], stru_size ,1,fp)!= 1 )printf ( "file write error\n" ); fclose ( fp ); } void display(){ FILE*fp; int i, stu_size ; stu_size = sizeof ( struct student_type ); if ((fp=fopen ("stu_dat","rb"))==NULL){ printf( "cannot open file\n" ); return; } for ( i = 0; i<SIZE; i++ ){ fread ( &stud[i],stu_size,1,fp ); printf ( "%-10s%4d%4d%-15s\n", stud[i].name,stud[i].num,stud[i].age,stud[i].addr); } fclose ( fp ); }9.2 .3文件的输入
printf(FILE*fp,char*format[,variable-list])intfscanf(FILE*fp,char*format[,address-list])printf()、scanf()函数相似,都是格式化读写函数; 只是两个函数的读写对象是磁盘文件,而不是键盘或显示器。printf(fp,"%d,%6.2f",i,t); fscanf ( fp,“%d,%f”,&i,&t ) ; 9.2 .3文件的输入
main ( ){ char s[80], c[80]; int a, b; FILE*fp; if(( fp = fopen ( "test","w" ) ) == NULL ){ puts ("can't open file") ; exit ( ) ; } fscanf ( stdin, "%s%d", s, &a ); fprintf (fp, "%s %d", s, a); fclose(fp); if ( (fp = fopen ( "test", "r" ) ) == NULL){ puts ( "can't open file" ) ; exit ( ) ; } fscanf ( fp,"%s%d", c, &b ); fprintf (stdout, "%s %d", c, b); fclose(fp); }9.2 .3文件的输入
功能从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或EOF即结束)
puts ( char*s, FILE*fp )9.2 .3文件的输入
【补充实例5】从键盘读入字符串存入文件,再从文件读回显示# include<stdio.h>
main (){ FILE*fp; char string [81]; if ( (fp = fopen ( "file.txt", "w" ) ) == NULL){ printf ( "cann't open file" ); exit (0) ; } while (strlen (gets ( string ))>0 ){ fputs(string,fp); fputs("\n",fp); } fclose(fp); if ( (fp = fopen ( "file.txt", "r" ) ) == NULL){ printf ( "cann't open file" ); exit (0) ; } while (fgets ( string, 81, fp ) != NULL)fputs ( string, stdout ) ; fclose(fp); }9.2 .3文件的输入
main ( ){ FILE*fp1,*fp2 ; fp1=fopen("f1.c", "r") ; fp2=fopen("f2.c", "w") ; while (! feof ( fp1 )) putchar ( fgetc ( fp1) ); rewind ( fp1 ) ; while ( ! feof ( fp1 ) )fputc ( fgetc ( fp1 ), fp2 ); fclose(fp1); fclose(fp2); }9.2 .3文件的输入
whence起始点,是下列三个宏定义之一:SEEK_SET0(文件开始)SEEK_CUR1(文件当前位置)SEEK_END2(文件末尾)
9.2 .3文件的输入
main ( ){ int i; FILE*fp; if( ( fp = fopen ( "studat", "rb" ) ) == NULL){ printf ( "can't open file\n" ) ; exit ( 0 ); } for ( i = 0 ; i<3 ; i += 2 ){ fseek ( fp, i*sizeof ( struct student_type ), 0 ); fread (&stud[i], sizeof(struct student_type),1, fp); printf ( "%s %d %d %s\n", stud[i].name,stud[i].num, stud[i].age, stud[i].addr ); } fclose(fp); }#include<stdio.h>struct student_type{ int num; char name[10]; int age; char addr[15]; } stud[3];9.2 .3文件的输入
#include<stdio.h>main ( ){ FILE*fp ; char filename[80] ; long length ; gets ( filename ) ; fp = fopen ( filename, "rb" ) ; if ( fp == NULL ) printf ( "file not found!\n" ) ; else{ fseek ( fp, 0L, SEEK_END ) ; length =ftell ( fp ); printf("Len of File is %ld bytes\n",length); fclose (fp) ; } }9.2 .3文件的输入
说明每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试;fopen件时,ferror函数初值自动置为0
说明出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数。
9.2 .3文件的输入
【补充实例9】ferror ( )与clearerr ( )举例。# include<stdio.h>int
main ( ){ FILE*stream; stream =fopen ( "DUMMY.FIL", "w" ) ; fgetc ( stream ) ; if (ferror ( stream) ){ printf ( "Error reading from DUMMY.FIL\n" ); clearerr ( stream ); } if (!ferror(stream))printf ( "Error indicator cleared!" ) ; fclose ( stream ) ; return 0; }9.3 用好文件要点
3用好文件要点文件操作是程序设计中非常重要的一环,很多同学反映文件这部分内容很难掌握,学完C语言初级课程后,大部分人难于应付文件方面的问题,其实和其他部分一样,掌握文件的使用也是有规可循的。
这一节,我们来归纳文件使用的一些要点和技巧。
9.3 用好文件要点
掌握文件操作的步骤理解文件结构FILE的作用和使用方法,用以下模式掌握文件操作的三大步骤。FILE*fp;fp=
fopen("文件名","方式"); if(fp==NULL){ …… } ……fclose(fp); 归结起来,文件操作只有打开、处理和关闭三类。注意并行操作的每一个文件都需要一个指向FILE结构的指针。一个文件指针只有在其关联的文件关闭后,才可以指向另一个文件。9.3 用好文件要点
用什么方式组织文件数据。文件的数据是ASCll码还是二进制方式。二进制文件打开时,要指明"r"方式。
9.3 用好文件要点
文件操作是顺序读写还是随机读写,是否需要定位文件位置指针。顺序读写文件位置指针自动移动,随机读写在每次读写前要使用fseek函数定位文件位置指针。
读写的数据是ASCll码还是二进制码。ASCll文件多使用顺序读写、二进制文件多使用随机读写。注意函数参数是变量名称还是变量地址。
注意判断读写操作是否成功。可用操作函数的返回值或ferror函数进行检查。要保持读写内容和文件位置指针的一致性。
9.3 用好文件要点
9.4 小结
文件的基本概念。
包括文件与文件输入/输出的概念,C语言中文件的两种组织形式(文本文件,二进制文件),标准输入/输出文件,文件操作的一般步骤,文件的基本操作及特点,FILE类型,文件结束标记EOF。
文件的读写方式。包括顺序读写文件和随机读写文件的概念,文件的读写位置指针,文件操作与文件指针的关系,常用的与文件位置指针有关的函数。
fopen(),fclose(),fgetc(),fputc(),fgets(),fputs(),和fprintf(),fscanf(),fread(),fwrite(),feof(),ferror()等函数的使用。下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}