第11章文件11.1文件的基本概念1.文件的概念文件是存储在外部存储介质上的信息的集合,每个文件用惟一的文件名(主文件名.后缀)来标识,计算机按名对文件进行读、写等有关操作。第11章文件11.1文件的基本概念1.文件的概念2.文件的分类(1)按数据的存储形式分类:文本文件、二进制文件文本文件:是将构成文件的每个字符用一个ASCII码来存储,一个字符占一个字节。例1:采用文本文件方式存储整数238,存储形式如下:001100100011001100111000字符'2'的ASCII码字符'3'的ASCII码字符'8'的ASCII码第11章文件11.1文件的基本概念1.文件的概念2.文件的分类(1)按数据的存储形式分类:文本文件、二进制文件二进制文件:是按数据在内存中的二进制码存储形式来存储。例2:采用二进制文件方式存储整数238,存储形式如下:0000000011101110整数238的二进制码(占2个字节)第11章文件11.1文件的基本概念1.文件的概念2.文件的分类(1)按数据的存储形式分类:文本文件、二进制文件(2)按文件的处理方式分类:缓冲文件系统、非缓冲文件系统输出文件缓冲区输入输出输入文件缓冲区输入输出磁盘程序数据区内存第11章文件11.1文件的基本概念1.文件的概念2.文件的分类3.文件的存取方式顺序存取:对文件的读写操作只能按顺序进行。即每当“打开”这类文件进行读或写操作时,总是从文件的开头开始,从头到尾顺序进行读或写,要读或写第n个字节时,先要读或写前n-1个字节。随机存取:对文件的读写操作可按指定的字节号进行。即可以通过调用库函数去指定开始读或写的字节号,然后直接对该位置上的数据进行读或写操作。第11章文件11.1文件的基本概念1.文件的概念2.文件的分类3.文件的存取方式4.文件类型的指针文件指针的定义形式如下:FILE*标识符;其中,标识符是一个指向FILE类型结构体的指针变量名第11章文件11.1文件的基本概念11.2文件的基本操作文件操作一般有如下四个基本步骤:(1)定义文件指针。(2)打开文件。(3)对文件进行读或写操作。(4)关闭文件。第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭1.文件的打开调用库函数fopen()的一般形式为:FILE*标识符;标识符=fopen(文件名,文件使用方式);例如:FILE*fp;fp=fopen(DT.dat,r);第11章文件文件使用方式含义r(只读)为输入打开一个文本文件w(只写)为输出打开一个文本文件a(追加)向文本文件末尾添加数据rb(只读)为输入打开一个二进制文件wb(只写)为输出打开一个二进制文件ab(追加)向二进制文件末尾添加数据r+(读写)为读/写打开一个文本文件w+(读写)为读/写建立一个新的文本文件a+(读写)为读/写打开一个文本文件rb+(读写)为读/写打开一个二进制文件wb+(读写)为读/写建立一个新的二进制文件ab+(读写)为读/写打开一个二进制文件第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭1.文件的打开2.文件的关闭调用库函数fclose()的一般形式为:fclose(标识符);例如:FILE*fp;fp=fopen(DT.dat,r);…fclose(fp);第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭11.2.2文件的读写1.字符读写函数第11章文件函数调用格式:ch=fgetc(fp);其中,ch是字符型变量,fp是文件指针。函数功能:从文件指针fp指向的文件当前位置(位置指针)读出一个字符,然后文件位置指针自动后移,指向文件中的下一个字符,返回值为读入的字符。若遇到文件结束符,则返回结束符EOF(值为-1)。文件指针fp指向的文件必须已经以读的方式打开。(1)字符输入函数fgetc()。第11章文件(1)字符输入函数fgetc()。例11.1将磁盘文件myfile.dat的信息读出并显示到屏幕上(假设文件已经存在)。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(myfile.dat,r))==NULL){printf(\nFilenotexist!);exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}第11章文件(1)字符输入函数fgetc()。(2)字符输出函数fputc()。函数调用格式:fputc(ch,fp);其中,ch是字符型数据,fp是文件指针。函数功能:把一个字符ch写到文件指针fp指向的磁盘文件上去。输出成功,返回输出的字符;输出失败,返回一个EOF(值为-1)。第11章文件(1)字符输入函数fgetc()。(2)字符输出函数fputc()。例11.2从键盘输入一串字符存到一个磁盘文件myfile.dat中,以“#”结束。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(myfile.dat,w))==NULL){printf(\nFilecannotopen!);exit(0);}while((ch=getchar())!='#')fputc(ch,fp);fclose(fp);}第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭11.2.2文件的读写1.字符读写函数2.字符串读写函数第11章文件(1)字符串输入函数fgets()。函数调用格式:fgets(str,n,fp);其中,str是字符型指针或字符型数组,n是整型数据,fp是文件指针。函数功能:从文件指针fp指向的文件中读取n-1个字符,把它送到由str指向的字符数组中。字符数组的长度应大于n,可存放n-1个字符,字符数组的最后一个元素为'\0'。若在读入n-1个字符前遇到换行符'\n'或文件结束符号EOF,立即结束读入操作。第11章文件(1)字符串输入函数fgets()。例11.3利用字符串输入函数fgets()将磁盘文件myfile.dat的信息读出并显示到屏幕上(假设文件已经存在)。#includestdio.hmain(){FILE*fp;charstr[81];if((fp=fopen(myfile.dat,r))==NULL){printf(Cannotopenfile!);exit(0);}while(fgets(str,81,fp)!=NULL)puts(str);fclose(fp);}第11章文件(1)字符串输入函数fgets()。(2)字符串输出函数fputs()。函数调用格式:fputs(str,fp);其中,str是字符型指针或字符型数组或字符串常量,fp是文件指针。函数功能:把字符串str写入由文件指针fp指向的文件中。输出成功,返回0;输出失败,返回非0。第11章文件(1)字符串输入函数fgets()。(2)字符串输出函数fputs()。例11.4从键盘输入若干行字符存到一个磁盘文件myfile.dat中。#includestdio.hmain(){FILE*fp;charstr[81];if((fp=fopen(myfile.dat,w))==NULL){printf(Filecannotopen!);exit(0);}while(fgets(str,81,stdin)!=NULL)fputs(str,fp);fclose(fp);}第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭11.2.2文件的读写1.字符读写函数2.字符串读写函数3.格式化读写函数第11章文件(1)格式化输入函数fscanf()函数调用格式:fscanf(文件指针,格式字符串,输入表列);函数功能:从“文件指针”指定的文件中按“格式字符串”指定格式输入数据给“输入表列”给出的变量。返回实际被赋值参数的个数。第11章文件(1)格式化输入函数fscanf()例11.5按指定的格式,从文件student.dat中将学生信息读出并显示在屏幕上。#includestdio.hmain(){FILE*fp;inti;if((fp=fopen(student.dat,r))==NULL){printf(Cannotopenfile!\n);exit(0);}printf(outputdata:\n);for(i=0;i5;i++)fscanf(fp,%d%s%c%d%s,&a[i].num,a[i].name,&a[i].sex,&a[i].age,a[i].addr);for(i=0;i5;i++,qq++)printf(%d%s%c%d%s\n,a[i].num,a[i].name,a[i].sex,a[i].age,a[i].addr);fclose(fp);}structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5];第11章文件(1)格式化输入函数fscanf()(2)格式化输出函数fprintf()函数调用格式:fprintf(文件指针,格式字符串,输出表列);函数功能:按“格式字符串”指定格式将“输出表列”给出的数据项输出到“文件指针”指定的文件中。返回实际输出数据的个数。第11章文件(1)格式化输入函数fscanf()(2)格式化输出函数fprintf()例11.6按指定的格式,将学生信息写入到文件student.dat中。#includestdio.hmain(){FILE*fp;inti,;if((fp=fopen(student.dat,w))==NULL){printf(Cannotopenfile!\n);exit(0);}printf(inputdata:\n);for(i=0;i5;i++)scanf(%d%s%c%d%s,&a[i].num,a[i].name,&a[i].sex,&a[i].age,a[i].addr);for(i=0;i5;i++,qq++)fprintf(fp,%d%s%c%d%s,a[i].num,a[i].name,a[i].sex,a[i].age,a[i].addr);fclose(fp);}structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5];第11章文件11.1文件的基本概念11.2文件的基本操作11.2.1文件的打开与关闭11.2.2文件的读写1.字符读写函数2.字符串读写函数3.格式化读写函数4.数据块读写函数第11章文件(1)数据块输入函数fread()函数调用格式:fread(buffer,size,count,fp);其中,buffer是一个指针,指向存放数据块(数组)的首地址,size是输入数据项的字节长度,count是输入数据项的个数,fp是文件指针。函数功能:从文件指针fp指定的文件中输入count个字节为size的数据,存放在buffer指向的数组中。第11章文件(1)数据块输入函数fread()例11.7利用数据块输入函数fread()完成例11.5。#includestdio.hmain(){FILE*fp;inti;intsize;size=sizeof(structstudent);if((fp=fopen(student.dat,r))==NULL){printf(Cannotopenfile!\n);exit(0);}printf(outputdata:\n);fread(a,size,5,fp);for(i=0;i5;i++,qq++)printf(%d%s%c%d%s\n,a[i].num,a[i].name,a[i].sex,a[i].age,a[i].addr);fclose(fp);}str