第10章对文件输入输出_第1页
第10章对文件输入输出_第2页
第10章对文件输入输出_第3页
第10章对文件输入输出_第4页
第10章对文件输入输出_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第10章对文件的输入输出王燕2/3/20231第10章对文件的输入输出主要内容10.1C文件的有关基本知识10.2打开与关闭文件10.3顺序读写数据文件10.4随机读写数据文件10.5文件读写的出错检测2/3/20232第10章对文件的输入输出重点难点文件的打开、关闭、读写2/3/20233第10章对文件的输入输出10.1C文件的有关基本知识文件有不同的类型,在程序设计中,主要用到两种文件:(1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件的内容是程序代码。(2)数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如一批学生的成绩数据,或货物交易的数据等。本章主要讨论的是数据文件2/3/20234第10章对文件的输入输出10.1C文件的有关基本知识使用数据文件的目的数据文件的改动不引起程序的改动:程序与数据分离。不同程序可以访问同一数据文件中的数据:数据共享。能长期保存程序运行的中间数据或结果数据。2/3/20235第10章对文件的输入输出10.1C文件的有关基本知识文件:文件指存储在外部介质如(磁盘磁带)上数据的集合。操作系统把各种设备都作为文件处理从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如:终端键盘是输入文件显示屏和打印机是输出文件2/3/20236第10章对文件的输入输出10.1C文件的有关基本知识文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放2/3/20237第10章对文件的输入输出10.1C文件的有关基本知识如int型数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果2/3/20238第10章对文件的输入输出10.1C文件的有关基本知识C语言的文件是流式文件。所谓流就是一系列的字节或者字符,输入输出数据流的开始和结束仅受程序控制,而不受物理符号(如回车符)的控制。这种文件称为流式文件。2/3/20239第10章对文件的输入输出10.1C文件的有关基本知识C语言对文件的两种处理方法:缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。磁盘文件输出文件缓冲区输入文件缓冲区程序数据区aANSIC使用缓冲文件系统2/3/202310第10章对文件的输入输出10.1C文件的有关基本知识非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。缓冲区指令区程序用户数据区磁盘2/3/202311第10章对文件的输入输出10.1C文件的有关基本知识从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)2/3/202312第10章对文件的输入输出10.1C文件的有关基本知识文件要有一个唯一的文件标识,以便用户识别和引用。文件标识包括三部分:(1)文件路径(2)文件名主干(3)文件后缀2/3/202313第10章对文件的输入输出10.1C文件的有关基本知识文件路径表示文件在外部存储设备中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件路径文件名主干文件后缀2/3/202314第10章对文件的输入输出10.1C文件的有关基本知识每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE声明FILE结构体类型的信息包含在头文件“stdio.h”中一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量2/3/202315第10章对文件的输入输出10.1C文件的有关基本知识typedefstruct{shortlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区的大小*/unsignedchar*buffer;/*数据缓冲区的位置*/unsignedchar*curp;/*指针,当前的指向*/unsignedistemp; /*临时文件,指示器*/shorttoken;/*用于有效性检查*/}FILE;2/3/202316第10章对文件的输入输出10.1C文件的有关基本知识定义文件类型变量存放文件的信息,如:定义FILE类型变量,存放文件信息:FILEf;定义文件型指针变量,指向FILE类型结构体变量,通过该结构体变量中的文件信息访问文件。如:FILE*fp;2/3/202317第10章对文件的输入输出10.2打开与关闭文件对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写所谓“关闭”是指撤销文件信息区和文件缓冲区2/3/202318第10章对文件的输入输出10.2打开与关闭文件文件使用方式:打开文件→文件读/写→关闭文件文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。如:fp=fopen("a1","r");在打开一个文件时,通知编译系统以下3个信息:①需要访问的文件的名字②使用文件的方式(“读”还是“写”等)③让哪一个指针变量指向被打开的文件文件关闭后,它的文件结构体被释放2/3/202319第10章对文件的输入输出10.2打开与关闭文件C语言文件操作用库函数实现,包含在stdio.h系统自动打开和关闭三个标准文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderr文件的打开(fopen函数)函数原型:FILE*fopen(char*name,char*mode)调用方式:fopen("文件名","使用文件方式")例:FILE*fp;fp=fopen("d:\\user\\myfile.txt","r");为什么\\Read2/3/202320第10章对文件的输入输出10.2打开与关闭文件返回值:正常打开,返回指向文件结构体的指针;打开失败,返回NULL。方式处理方式指定文件不存在文件存在r 只读出错正常w只写建立新文件原内容丢失a追加建立新文件在原内容后追加r+/w+读写出错正常2/3/202321第10章对文件的输入输出10.2打开与关闭文件如果打开失败,fopen函数将会带回一个出错信息。fopen函数将带回一个空指针值NULL常用下面的方法打开一个文件:if((fp=fopen("file1","r"))==NULL){ printf("cannotopenthisfile\n");exit(0);}终止正在执行的程序2/3/202322第10章对文件的输入输出10.2打开与关闭文件#include<stdio.h>#include<stdlib.h>voidmain(){ FILE*fp; fp=fopen("aa.c","w"); if(fp==NULL) {printf("Fileopenerror!\n");

exit(0);/*关闭所有文件终止调用*/ }}2/3/202323第10章对文件的输入输出10.2打开与关闭文件文件的关闭(fclose函数)作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。如果不关闭文件将会丢失数据。返回值:用于表示文件是否被正确地关闭,如果文件顺利关闭,该值为0,否则为-1(EOF)。返回值可以用ferror函数测试。FILE*fp;fp=fopen("a.txt","r");fclose(fp);2/3/202324第10章对文件的输入输出10.3顺序读写数据文件在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面在顺序读时,先读文件中前面的数据,后读文件中后面的数据对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的顺序读写需要用库函数实现2/3/202325第10章对文件的输入输出10.3顺序读写数据文件读/写文件中的一个字符fputc函数(putc函数)函数原型:intfputc(intc,FILE*fp)功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,为EOF(-1)fgetc函数(getc函数)函数原型:int

fgetc(FILE*fp)功能:从fp指向的文件中读取一字节代码返值:返回读到的代码值;读到文件尾或出错为EOF(-1)字符常量或变量文件指针变量2/3/202326第10章对文件的输入输出10.3顺序读写数据文件feof函数调用方式:feof(fp)功能:对于二进制文件读取时判断文件是否结束。返值:结束-1;反之0。例10.1:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。2/3/202327第10章对文件的输入输出#include<stdlib.h>#include<stdio.h>voidmain(){ FILE*fp; charch,filename[10]; scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("cannotopenfile\n"); exit(0);/*终止程序*/ }ch=getchar();/*接收执行scanf时最后输入的回车符*/ ch=getchar();/*第一个输入的字符被赋给变量ch*/ while(ch!='#') { fputc(ch,fp);/*字符被写入filename表示的文件中*/ putchar(ch);/*字符被输出到显示器*/ ch=getchar(); } fclose(fp);/*关闭文件*/}运行情况如下:file1.c(输入磁盘文件名)computerandc#(输入一个字符串)computerandc(输出一个字符串)2/3/202328第10章对文件的输入输出10.3顺序读写数据文件例10.2:将一个磁盘文件中的信息复制到另一个磁盘文件中。解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,然后逐个输出到file2.dat中。2/3/202329第10章对文件的输入输出#include<stdlib.h>#include<stdio.h>voidmain(){ FILE*in,*out; charch,infile[10],outfile[10]; printf("Entertheinfilename:\n"); scanf("%s",infile); printf("Entertheoutfilename:\n");scanf("%s",outfile); if((in=fopen(infile,"r"))==NULL) { printf("cannotopeninfile\n"); exit(0);} if((out=fopen(outfile,"w"))==NULL) {printf("cannotopenoutfile\n");exit(0); } while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out); }2/3/202330第10章对文件的输入输出10.3顺序读写数据文件2.fgets和fputs函数形式:fgets(str,n,fp);(str字符数组,n-1个字符)fputs(字符串,fp);("\0"不输出)作用:从fp指向的文件读/写一个字符串返值:fgets正常时返回字符串的首地址;出错或文件尾,NULLfputs正常时返回写入的最后一个字符;出错为EOF2/3/202331第10章对文件的输入输出举例例10.3:从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。解题思路:为解决问题,可分为三个步骤:从键盘读入n个字符串,存放在一个二维字符数组中,每一个一维数组存放一个字符串;对字符数组中的n个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;将字符数组中的字符串顺序输出。2/3/202332第10章对文件的输入输出#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){FILE*fp;charstr[3][10],temp[10];inti,j,k,n=3;printf("Enterstrings:\n");for(i=0;i<n;i++)gets(str[i]);for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(str[k],str[j])>0)k=j;2/3/202333第10章对文件的输入输出if(k!=i) {strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp);}}if((fp=fopen("D:\\CC\\string.dat","w"))==NULL){printf("can'topenfile!\n");exit(0);}printf("\nThenewsequence:\n");for(i=0;i<n;i++) {fputs(str[i],fp);fputs("\n",fp); printf("%s\n",str[i]);}return0;}人为地输出一个'\n'2/3/202334第10章对文件的输入输出例从键盘读入字符串存入文件,再从文件读回显示#include<stdio.h>#include<string.h>voidmain(){FILE*fp;charstring[81];if((fp=fopen("file.txt","w"))==NULL){printf("cann'topenfile");return;}while(strlen(gets(string))>0){fputs(string,fp);

fputs("\n",fp);}

fclose(fp);if((fp=fopen("file.txt","r"))==NULL){printf("cann'topenfile");return;}while(fgets(string,81,fp)!=NULL)

fputs(string,stdout);fclose(fp);}2/3/202335第10章对文件的输入输出10.3顺序读写数据文件按指定格式读写文件的函数:fprintf和fscanf一般调用格式:fscanf(fp,格式字符串,输入列表);fprintf(fp,格式字符串,输出列表);返值:成功,返回I/O的个数;出错或文件尾,返回EOF由于输入输出时要进行ASCII码和二进制形式的转换,费时较多。fscanf(fp,"%d,%f"

,&i,&t);/*若文件中有3,4.5,则将3读出送入i,4.5读出送入t*/fprintf(fp,"%d,%6.2f"

,i,t);/*将i和t按%d,%6.2f格式写入到fp文件*/2/3/202336第10章对文件的输入输出voidsave(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","w"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)

fprintf(fp,"%s%d%d%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);

fclose(fp);}2/3/202337第10章对文件的输入输出voiddisplay(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","r"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++){fscanf(fp,"%s%d%d%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);

printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}

fclose(fp);}2/3/202338第10章对文件的输入输出10.3顺序读写数据文件数据块输入输出函数:fread与fwrite一般调用形式:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);参数说明:buffer:要读入的数据块的存放首地址或要输出的数据块的起始地址。size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针2/3/202339第10章对文件的输入输出10.3顺序读写数据文件返值:成功,返count的值;出错或文件尾,0值。fread与fwrite一般用于二进制文件的输入/输出,若文件以二进制形式打开,用fread或fwrite可读写任何类型的数据。如:fread(f,4,2,fp)2/3/202340第10章对文件的输入输出举例例10.4:从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。解题思路:定义有10个元素的结构体数组,用来存放10个学生的数据从main函数输入10个学生的数据用save函数实现向磁盘输出学生数据用fwrite函数一次输出一个学生的数据2/3/202341第10章对文件的输入输出#include<stdio.h>#defineSIZE10structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];voidmain(){inti;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();}2/3/202342第10章对文件的输入输出voidsave(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)

if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)

printf("filewriteerror\n");

fclose(fp);}文件必须是以“二进制”打开的2/3/202343第10章对文件的输入输出voiddisplay(){FILE*fp;inti;if((fp=fopen("d:\\stu_list","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}

fclose(fp);}2/3/202344第10章对文件的输入输出10.3顺序读写数据文件例题:将4个学生的数据,从磁盘文件stu_dat调入,然后输出到stu_list文件中,并在屏幕上显示磁盘文件的内容。2/3/202345第10章对文件的输入输出10.3顺序读写数据文件#include<stdio.h>#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){load();

save();display();}voidload(){FILE*fp;inti;if((fp=fopen("d:\\stu_dat","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fread(&stud[i],sizeof(structstudent_type),1,fp)!=1){if(feof(fp)){fclose(fp);retun;}printf("filereaderror\n");}

fclose(fp);}2/3/202346第10章对文件的输入输出10.4随机读写数据文件对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多文件位置标记:为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件标记),用来指示“接下来要读写的下一个字符的位置”2/3/202347第10章对文件的输入输出10.4随机读写数据文件文件位置由文件打开方式确定。"r""w":指向文件头"a":指向文件尾读写方式顺序读写:文件位置按字节位置顺序移动。随机读写:文件位置按需要移动到任意位置。2/3/202348第10章对文件的输入输出10.4随机读写数据文件rewind函数函数原型:voidrewind(FILE*fp)功能:重置文件位置指针到文件开头返值:无例10.5:有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。2/3/202349第10章对文件的输入输出#include<stdio.h>voidmain(){FILE*fp1,*fp2;fp1=fopen("c:\\tc\\user\\ch12_4.c","r");fp2=fopen("d:\\tc\\user\\ch12_41.c","w");while(!feof(fp1))putchar(getc(fp1));

rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);

fclose(fp1);fclose(fp2);}2/3/202350第10章对文件的输入输出10.4随机读写数据文件fseek函数和随机读写调用形式:fseek(文件类型指针,位移量,起始点)功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值位移量(以起始点为基点,移动的字节数)>0向后移动,<0向前移动起始点文件开始SEEK_SET0文件当前位置

SEEK_CUR1文件末尾SEEK_END2例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);2/3/202351第10章对文件的输入输出10.4随机读写数据文件例10.6:文件内存有10个学生数据,将单数学生数据输入计算机并在屏幕上显示#include<stdlid.h>#include<stdio.h>structstudent_type{charname[10];intnum;intage;charsex;}stud[10];2/3/202352第10章对文件的输入输出voidmain(){FILE*fp;inti;if((fp=fopen("stud_dat","rb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structstudent_type),0);fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}

fclose(fp);}2/3/202353第10章对文件的输入输出10.4随机读写数据文件ftell函数函数原型:longftell(FILE*fp)功能:得到流式文件中位置指针当前位置(用相对于文件开头的位移量表示)返值:返回当前位置指针位置;失败,返回-1L2/3/202354第10章对文件的输入输出例求文件长度#include"stdio.h"voidmain(){FILE*fp;charfilename[80];longlength;

gets(filename);

fp=fopen(filename,"rb");if(fp==NULL)printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);length=ftell(fp);printf("LengthofFileis%1dbytes\n",lengt

温馨提示

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

评论

0/150

提交评论