关闭

关闭

关闭

封号提示

内容

首页 10.文件.ppt

10.文件.ppt

10.文件.ppt

上传者: wanroutianze 2011-08-27 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《10.文件ppt》,可适用于高等教育领域,主题内容包含第十章第十章什么是文件?什么是文件?文件有不同的类型在进行C语言程序设计的过程中主要用到两种文件:()程序文件:包括源程序文件(后缀为c)、目标文件符等。

第十章第十章什么是文件?什么是文件?文件有不同的类型在进行C语言程序设计的过程中主要用到两种文件:()程序文件:包括源程序文件(后缀为c)、目标文件(后缀为obj)、可执行文件(后缀为exe)。这种文件是用来存放程序的。()数据文件:文件的内容不是程序而是供程序运行时读写的数据如在程序运行过程中输出到磁盘的数据。如一批学生的成绩数据或货物交易的数据等。本章讨论的是数据文件。C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。使用数据文件的目的、数据文件的改动不引起程序的改动程序与数据分离、不同程序可以访问同一数据文件中的数据数据共享、能长期保存程序运行的中间数据或结果数据文件名一个文件要有一个唯一的文件标识以便用户识别和引用。文件标识包括部分:文件路径、文件名主干和文件后缀。文件路径表示文件在外部存储设备中的位置。如:d:cctempfilec文件分类按数据的组织形式:文本文件:ASCII文件每个字节存放一个字符的ASCII代码。二进制文件:把内存中的数据按其在内存中的存储形式原样存放。注意:字符型数据只能以ASCII形式存储数值型数据可以用ASCII形式存储在磁盘上也可以用二进制形式存储。说明:用ASCII码形式输出与字符一一对应一个字节代表一个字符因而便于对字符进行逐个处理也便于输出字符。但一般占存储空间较多而且要花时间转换(二进制形式与ASCII码间的转换)。用二进制形式输出数值可以节省外存空间和转换时间但一个字节并不对应一个字符不能直接输出字符形式。一般作为中间结果的数值型数据需要暂时保存在外存上以后又需要输入到内存常用二进制文件保存。文件缓冲区:缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读入数据则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区)然后再从缓冲区逐个将数据送到程序数据区(给程序变量)。文件类型指针缓冲文件系统中关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的取名为FILE。定义FILE结构体类型的信息包含在头文件stdioh中。在程序中可以直接用FILE类型名定义变量。每一个FILE类型变量对应一个文件的信息区其中包含该文件的有关信息。例如:FILEf定义了一个结构体变量f可以用它来存放一个文件的有关信息。这些信息是建立文件时根据文件的性质由编译系统自动放入的用户不必过问。注意:一般不通过变量的名字来引用这些变量而是设置一个指向FILE类型变量的指针变量然后通过它来引用这些FILE类型变量。下面定义一个指向文件型数据的指针变量:FILE*fp定义fp是一个指向FILE类型变量的指针变量。可以使fp指向某一个文件的文件信息区(是一个结构体变量)从而通过该结构体变量中的文件信息能够访问该文件。如果有n个文件一般应设n个指针变量使它们分别指向n个FILE类型变量以实现对n个文件的访问。文件的打开与关闭文件的打开与关闭一文件的打开(fopen函数)fopen函数的调用方式通常为:fopen(文件名使用文件方式)例如:fopen(“a”,“r”)表示要打开名字为a的文件使用文件方式为“读入”。fopen函数的返回值是指向a文件的指针(即a文件信息区的起始地址)。通常将fopen函数的返回值赋给一个指向文件的指针变量。例如:FILE*fp*定义一个指向文件的指针变量fp*fp=fopen(“a”,“r”)*将fopen函数的返回值赋给指针变量fp*可以看出在打开一个文件时通知了编译系统以下个信息:需要打开的文件名也就是准备访问的文件的名字使用文件的方式(“读”还是“写”等)让哪一个指针变量指向被打开的文件。文件使用方式     含  义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件"ab“(追加)向二进制文件尾增加数据"r“(读写)为读写打开一个文本文件"w”(读写)为读写建立一个新的文本文件"a”(读写)为读写打开一个文本文件"rb“(读写)为读写打开一个二进制文件“wb“(读写)为读写建立一个新的二进制文件“ab”(读写)为读写打开一个二进制文件说明:如果不能实现“打开”的任务fopen函数将会带回一个出错信息。出错的原因可能是用r方式打开了一个并不存在的文件、磁盘出故障、磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值(在stdioh文件中已被定义为)。常用下面的方法打开一个文件:if((fp=fopen(“file”,"r"))==){printf("Cannotopenthisfilen")exit()}exit函数的作用是关闭所有文件终止正在执行的程序待用户检查出错误修改后再运行。二文件的关闭(fclose函数)函数调用的一般形式为:fclose(文件指针)例如:fclose(fp)前面我们把打开文件时所带回的指针赋给了fp现在把fp指向的文件关闭此后fp不再指向该文件。函数功能:使文件指针变量不指向该文件也就是文件指针变量与文件“脱钩”此后不能再通过该指针对原来与其相联系的文件进行读写操作。返回值:关闭成功返回值为0否则返回EOF()。文件的读写一、向文件读写一个字符:fputc与fgetcfputc函数原型:fputc(ch,fp)功能:把字符ch写到文件指针变量fp所指向的文件中返回值:输出成功返回值就是输出的字符输出失败则返回EOF(即)fgetc函数原型:fgetc(fp)功能:从fp指向的文件中读入一个字符返回值:读成功带回所读的字符失败则返回文件结束标志EOF(即)常见的读取字符操作从一个文本文件顺序读入字符并在屏幕上显示出来:ch=fgetc(fp)while(ch!=EOF) { putchar(ch)ch=fgetc(fp) }注意:EOF不是可输出字符因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1因此EOF定义为-1是合适的。当读入的字符值等于-1时表示读入的已不是正常的字符而是文件结束符。常见的读取字符操作从一个二进制文件顺序读入字符:while(!feof(fp)) {ch=fgetc(fp) }注意:ANSIC提供一个feof()函数来判断文件是否真的结束。如果是文件结束函数feof(fp)的值为1(真)否则为0(假)。以上也适用于文本文件的读取。二、格式化读写函数(fprintf()和fscanf())函数调用:fprintf(文件指针格式字符串输出表列)fscanf(文件指针格式字符串输入表列)函数功能:从磁盘文件中读入或输出字符。例如:fprintf(fp,”d,f”,i,f)它的作用是将整型变量i和实型变量f的值按d和f的格式输出到fp指向的文件中。这是和输出到屏幕的情况相似的只是它没有输出到屏幕而是输出到文件而已。同样用以下fscanf函数可以从磁盘文件上读入字符:例如:fscanf(fp,”d,f”,i,t)磁盘文件上如果有以下字符:则从磁盘文件中读取数据送给变量i送给变量t。说明:用fprintf和fscanf函数对磁盘文件读写使用方便容易理解但由于在输入时要将文件中的ASC码转换为二进制形式再保存到内存变量中在输出时又要将内存中的二进制形式转换成字符花费时间比较多。因此在内存与磁盘频繁交换数据的情况下最好不用fprintf和fscanf函数而用下面介绍的fread和fwrite函数进行二进制的读写。三、数据块读写函数(fread()和fwrite())在程序中不仅需要一次输入输出一个数据而且常常需要一次输入输出一组数据(如数组或结构体变量的值)ANSIC标准允许用fread函数从文件读一个数据块用fwrite函数向文件写一个数据块。在进行读写时是以二进制形式进行的。在向磁盘写数据时直接将内存中一组数据原封不动、不加转换的复制到磁盘文件上在读入时也是将磁盘文件中若干字节的内容一批读入内存。它们的一般调用形式为:fread(buffer,size,countfp)fwrite(buffer,size,count,fp)参数说明:buffer:是一个指针。对fread来说它是读入数据的存放地址。对fwrite来说是要输出数据的地址(均指起始地址)。size:要读写的字节数。count:要进行读写多少个size字节的数据项。fp:文件型指针。使用举例:若文件以二进制形式打开:fread(f,,,fp)其中f是一个实型数组名。一个实型变量占个字节。此函数从fp所指向的文件中读入个个字节的数据存储到数组f中。fread(buffer,size,countfp)参数说明:buffer:是一个指针。对fread来说它是读入数据的存放地址。对fwrite来说是要输出数据的地址(均指起始地址)。size:要读写的字节数。count:要进行读写多少个size字节的数据项。fp:文件型指针。例结构体数组有个元素,每一个元素来存放一个学生的数据structstudent{intnumcharnameintagefloatscore}stud假设学生的数据已存放在磁盘文件中,可以用fread函数读入个学生的数据:for(i=i<i)fread(studi,sizeof(structstudent),,fp)可以用fwrite函数将内存中的学生数据输入到磁盘文件中:for(i=i<i)fwrite(studi,sizeof(structstudent),,fp)使用举例:例从键盘输入4个学生的有关数据然后把它们转存到磁盘文件上去。#include<stdioh>#defineSIZEstructstudenttype{charnameintnumintagecharaddr}studSIZE*定义全局结构体数组stud包含个学生数据*voidsave()*定义函数save向文件输出SIZE个学生数据*{FILE*fpintiif((fp=fopen("studat","wb"))==)*为输出打开一个二进制文件studat*{printf("cannotopenfilen")return}for(i=i<SIZEi)*二进制写*if(fwrite(studi,sizeof(structstudenttype),,fp)!=)printf(“filewriteerrorn”)*出错处理*fclose(fp)}*关闭文件*main(){intifor(i=i<SIZEi)*从键盘读入学生信息*scanf("sdds",studiname,studinum,studiage,studiaddr)save()}*调用save()保存学生信息*运行情况如下:输入4个学生的姓名、学号、年龄和地址:Zhang 1001 19 room101Fun100220room102Tan100321room103Ling100421room104 #include<stdioh>#defineSIZEstructstudenttype{charnameintnumintagecharaddr}studSIZEmain(){intiFILE*fpfp=fopen("studat","rb")for(i=i<SIZEi){fread(studi,sizeof(structstudenttype),,fp)printf("sddsn",studiname,studinum,studiage,studiaddr)}fclose(fp)}屏幕上显示出以下信息:Zhang100119room101Fun100220room102Tan100321room103Ling100421room104 验证在磁盘文件“studat”中是否已存在此数据用以下程序从“studat”文件中读入数据然后在屏幕上输出。文件的定位文件位置指针:为了对读写进行控制系统为每个文件设置了一个位置指针用来指示当前的读写位置。注意:要区别文件指针(指向文件的指针)和位置指针(用来指向在文件中当前读写位置)。位置指针并不是一个地址而是“指示标志”的意思。为了避免与变量的指针相混淆可以把它理解为“文件的读写位置”。读写方式顺序读写:位置指针按字节位置顺序移动叫~随机读写:位置指针按需要移动到任意位置叫~怎样强制的使位置指针指向指定的位置呢?rewind函数Rewind函数的作用是使位置指针重新返回文件的开头此函数没有返回值。fseek函数用fseek函数可以改变文件位置指针的位置。文件输入输出小结文件输入输出小结分类函数名功能打开文件fopen()打开文件关闭文件fclose()关闭文件文件定位fseek()改变文件位置指针的位置Rewind()使文件位置指针重新至于文件开头Ftell()返回文件位置指针的当前值文件状态feof()若到文件末尾函数值为真Ferror()若对文件操作出错函数值为真Clearerr()使ferror和feof()函数值置零分类函数名功能文件读写fgetc(),getc()从指定文件取得一个字符fputc(),putc()把字符输出到指定文件fgets()从指定文件读取字符串fputs()把字符串输出到指定文件getw()从指定文件读取一个字(int型)putw()把一个字输出到指定文件fread()从指定文件中读取数据项fwrite()把数据项写到指定文件中fscanf()从指定文件按格式输入数据fprintf()按指定格式将数据写到指定文件中

职业精品

用户评论

0/200
    暂无评论

精彩专题

上传我的资料

热门资料

资料评价:

/33
0下载券 下载 加入VIP, 送下载券

意见
反馈

返回
顶部