版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C程序设计第13章 文件文件(file)是程序设计中一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。以前各章中所用到的输入和输出,都是以终端为对象的,即从终端键盘输入数据,运行结果输出到终端上。从操作系统的角度看,每一个与主机相联的输入输出设备都看作是一个文件。例如,终端键盘是输入文件,显示器和打印机是输出文件。在程
2、序运行时,常常需要将一些数据(运行的最终结果和中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。C语言把文件看作是一个字符(字节)的序列,即一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。由前所述,一个C文件是一个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限。换句话说,C语言中文件并不是由记录(record)组成的(这是和PASCAL或其他
3、高级语言不同的)。在C语言中对文件的存取是以字符(字节)为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。也就是说,在输出时不会自动增加回车换行符以作为记录结束的标志,输入时不以回车换行符作为记录的间隔(事实上C文件并不由记录构成)。把这种文件称为流式文件。C语言允许对文件存取一个字符,这就增加了处理的灵活性。在过去使用的C版本(如UNIX系统下使用的C)有两种对文件的处理方法:一种叫“缓冲文件系统”,一种叫“非缓冲文件系统”。所谓缓冲文件系统是指系统自动地在内存中为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲
4、区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。缓冲区的大小由各个具体的C版本确定,一般为512字节。所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。在UNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统处理二进制文件。用缓冲文件系统进行的输入输出又称为高级(或高层)磁盘输入输出(高层I/O),用非缓冲文件系统进行的输入输出又称为低级(低层)输入输出系统。ANSI C标准决定不采用非缓冲文件系统,而只采用缓冲文件系统。即既用缓冲文件
5、系统处理文本文件,也用它来处理二进制文件。也就是将缓冲文件系统扩充为可以处理二进制文件。在C语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写。13.2 文件类型指针缓冲文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。13.3 文件的打开与关闭13.3.1 文件的打开(fopen函数)文件使用方式含义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一
6、个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件“ab”(追加)向二进制文件尾增加数据“r+”(读写)为读/写打开一个文本文件“w+”(读写)为读/写简历一个新的文本文件“a+”(读写)为读/写打开一个文本文件“rb+”(读写)为读/写打开一个二进制文件“wb+”(读写)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件说明:(1)用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,不能用“r”方式打开一个并不存在的文件(即输入文件),否则出错。(2)用
7、“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。(3)如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。但此时该文件必须已存在,否则将得到出错信息。打开时,位置指针移到文件末尾。(4)用“r+”、“w+”、 “a+”方式打开的文件既可以用来输入数据,也可以用来输出数据。用“r+”方式时该文件应该已经存在,以便能向计算机输入数据。用“w+”方式则新建立一个文件,先向此文件写数据,然后
8、可以读此文件中的数据。用“a+”方式打开的文件,原来的文件不被删去,位置指针移到文件末尾,可以添加,也可以读。(5)如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL。(6)在向计算机输入文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。(7)在程序开始运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错
9、输出。这3个文件都与终端相联系。因此以前所用到的从终端输入或输出都不需要打开终端文件。系统自动定义了3个文件指针stdin、stdout和stderr,分别指向终端输入、终端输出和标准出错输出(也从终端输出)。如果程序中指定要从stdin所指的文件输入数据,就是指从终端键盘输入数据。13.3.2 文件的关闭(fclose函数)在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,以后不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。13.4 文件的读写13.4.1 文本文件的读写1、
10、写字符函数fputc和读字符函数fgetc例13.1从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止例13.2将一个磁盘文件中的信息复制到另一个磁盘文件中2、写字符串函数fputs和读字符串函数fgets例13.3将学生数据,由键盘输入并存储到磁盘文件中例13.4从上例文件中读取学生数据,并显示在屏幕上3、格式化写函数fprintf和格式化读函数fscanf例13.5将学生数据,由键盘输入并存储到磁盘文件中例13.6从上例文件中读取学生数据,并显示在屏幕上13.4.2 二进制文件的读写1、fread函数和fwrite函数例13.7从键盘输入4个学生数据,然后把它们转存到磁盘文
11、件上去,然后再从磁盘文件中一次性读入内存并显示出来13.5 文件的定位文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置,可以用后面介绍的有关函数。13.5.1 rewind函数rewind函数的作用是使位置指针重新返回文件的开头,此函数没有返回值。例13.8有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上13.5.2 fseek函数和随机读写对流式文件可以进行顺序读写,也可以进行随机读写,关键在于控制文件的位置指针。如果位置指
12、针是按字节位置顺序移动的,就是顺序读写;如果能将位置指针按需要移动到任意位置,就可以实现随机读写。所谓随机读写,是指读写完上一个字符(字节)后,并不一定要读写其后的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。用fseek函数可以实现改变文件的位置指针。例13.9在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来13.5.3 ftell函数ftell函数的作用是得到流失文件中的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,往往不容易知道其当前位置。用ftell函数可以得到当前位置。13.6 出错的检测1
13、3.6.1 ferror函数13.6.2 clearerr函数13.7 文件输入输出小结分类分类函数名函数名功能功能打开文件打开文件fopen()打开文件打开文件关闭文件关闭文件fclose()关闭文件关闭文件文件定位文件定位fseek()改变文件位置指针的位置改变文件位置指针的位置rewind()使文件位置指针重新置于文件开头使文件位置指针重新置于文件开头ftell()返回文件位置指针的当前值返回文件位置指针的当前值文件读写文件读写fgetc(), getc()从指定文件取得一个字符从指定文件取得一个字符fputc(), putc()把字符输出到指定文件把字符输出到指定文件fgets()从指
14、定文件读取字符串从指定文件读取字符串fputs()把字符串输出到指定文件把字符串输出到指定文件getw()从指定文件读取一个字从指定文件读取一个字(int型型)putw()把一个字把一个字(int型型)输出到指定文件输出到指定文件fread()从指定文件中读取数据项从指定文件中读取数据项fwrite()把数据项写到指定文件把数据项写到指定文件fscanf()从指定文件按格式输入数据从指定文件按格式输入数据fprintf()按指定格式将数据写到指定文件中按指定格式将数据写到指定文件中文件状态文件状态feof()若到文件末尾,函数值为若到文件末尾,函数值为“真真”(非非0)ferror()若对文件操作出错,函数值为若对文件操作出错,函数值为“真真”(非非0)clearerr()使使ferror和和feof函数值置零函数值置零习题13.4 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符以“!”结束。13.5 有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件“C”中去。13.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 飞鸟集读后感范文
- 招生实践报告
- 心理健康教育工作总结15篇
- 关于美德演讲稿范文800字(32篇)
- 暑假护士见习报告(3篇)
- 浙江省丽水市(2024年-2025年小学五年级语文)统编版质量测试(上学期)试卷及答案
- 湖北省黄冈市(2024年-2025年小学五年级语文)人教版质量测试((上下)学期)试卷及答案
- 市政道路路基土方、石方施工规范征求意见稿
- 上海市市辖区(2024年-2025年小学五年级语文)统编版期中考试(上学期)试卷及答案
- 上海市县(2024年-2025年小学五年级语文)统编版开学考试((上下)学期)试卷及答案
- 2024年中级经济师(金融)《专业知识与实务》考前必刷必练题库500题(含真题、必会题)
- 形势与政策智慧树知到答案2024年黑龙江农业工程职业学院
- 2024年建筑业10项新技术
- 数值实验报告-实验三
- 快时尚服装品牌的营销策略分析以zara为例
- 07预应力工程ppt课件
- SMT 供应商出货检验报告书.doc
- 韩语千字文(中韩对照带韩语释义)
- 体育教学论文:探讨三人篮球运动在中学的发展
- 家族教育基金会章程(参考模板)
- 耳鼻喉常用诊疗操作规范法
评论
0/150
提交评论