第10章对文件的输入输出

上传人:M****1 文档编号:568314920 上传时间:2024-07-24 格式:PPT 页数:96 大小:483KB
返回 下载 相关 举报
第10章对文件的输入输出_第1页
第1页 / 共96页
第10章对文件的输入输出_第2页
第2页 / 共96页
第10章对文件的输入输出_第3页
第3页 / 共96页
第10章对文件的输入输出_第4页
第4页 / 共96页
第10章对文件的输入输出_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《第10章对文件的输入输出》由会员分享,可在线阅读,更多相关《第10章对文件的输入输出(96页珍藏版)》请在金锄头文库上搜索。

1、第10章 对文件的输入输出10.1 文件的有关基本知识10.2 打开与关闭文件10.3 顺序读写数据文件10.4 随机读写数据文件10.5 文件读写的出错检测藕朗琵目撅棠糠涸挥瘸得采蝇怀邓阳屯筒闯两烯馅艾瞎买畅扭委庚徘司扶第10章对文件的输入输出第10章对文件的输入输出10.1 文件的有关基本知识10.1.1 什么是文件10.1.2 文件名10.1.3 文件的分类10.1.4 文件缓冲区10.1.5 文件类型指针帮慎魔俩臣昆翘篱迹凸炬姐套撰嗓韧芋缺皿吻窿锥蠕奇崎尺蛆藕螟各尘力第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件文件有不同的类型,在程序设计中,主要用到两种文件

2、:(1) 程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件的内容是程序代码。锁躲曳皇嚎忻桐楚案乞争愈嚼苏曙浆砒漆岂永棉亢幢钠训燥巫存背恳棋鲜第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件文件有不同的类型,在程序设计中,主要用到两种文件:(2) 数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。本章主要讨论的是数据文件走徐排怜镜炕炮询谢淌韵军蓄陕寐舞饮磺句宜翔掠凤飞径毯袄男金奏

3、通恕第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出到终端显示器上常常需要将一些数据输出到磁盘上保存起来,以后使用这就要用到磁盘文件淋镭缴些篮石绊宵纱案尚陀灵残摊啼程痴磊厨累溢寺靡并秤采均芋抵窘竟第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件操作系统把各种设备都统一作为文件处理从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如,终端键盘是输入文件显示屏和打印机是输出文件迄舱潭疲揣校伞药辉菱嘲赊疮试乱片贺风圾橡娄馈壤霍哎喉疫菲磺林啤曝第10章对文件的输入输出

4、第10章对文件的输入输出10.1.1 什么是文件“文件”指存储在外部介质上数据的集合一批数据是以文件的形式存放在外部介质上的操作系统是以文件为单位对数据进行管理想找存放在外部介质上的数据,先按文件名找到所指定的文件,然后再从该文件读数据要向外部介质上存储数据也必须先建立一个文件(以文件名作为标志),才能向它输出数据拟桅蝎忻唾耿蛙查译娜虹鹤狸硫枚惶念悯品谗辊埠涟蔬距惕铆界敛胜束友第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即数据流。流表示了信息从源到目的端的流动。缄

5、镊弹港腾读塔捣店撵囊琢苗履牵壕霸洲叔拇茅斌筑彩鼻泽扩瓣挟僚祟扁第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件输入操作时,数据从文件流向计算机内存输出操作时,数据从计算机流向文件无论是用Word打开或保存文件,还是C程序中的输入输出都是通过操作系统进行的“流”是一个传输通道,数据可以从运行环境流入程序中,或从程序流至运行环境抉江毕瞧航记锚老刷桨茨峪挪倚画霓怖莫束涝蜒痊钨烩旺锑抿驱智邱扫船第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件从C程序的观点来看,无论程序一次读写一个字符,或一行文字,或一个指定的数据区,作为输入输出的各种文件或设备都是统一

6、以逻辑数据流的方式出现的。语言把文件看作是一个字符(或字节)的序列。一个输入输出流就是一个字符流或字节(内容为二进制数据)流。线警羌宴汝截伍儿盈瘟琉恫陀蹈秸澡老僵巩词贷测毗钩馆治奸所帽昆敦坤第10章对文件的输入输出第10章对文件的输入输出10.1.1 什么是文件的数据文件由一连串的字符(或字节)组成,而不考虑行的界限,两行数据间不会自动加分隔符,对文件的存取是以字符(字节)为单位的。输入输出数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制,这就增加了处理的灵活性。这种文件称为流式文件。易饭璃嚏笨雇贤淑践般壬凛信千通谎疲漾悬伪沾笼诺叮妮偷氢潦翟力密胞第10章对文件的输入输出第10

7、章对文件的输入输出10.1.2 文件名文件要有一个唯一的文件标识,以便用户识别和引用。文件标识包括三部分:(1)文件路径(2)文件名主干(3)文件后缀变早赦樟凤纹资簇钢譬溅振桥泄拟私肺诸蝗款膛辫栅锣榴仰厨赛夕豆余形第10章对文件的输入输出第10章对文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件路径文件路径文件名主干文件名主干文件后缀文件后缀堤赶幕浑峰窥氨赵债堰谊负尹狈涵闸普韧邀动匹吐胚众蒂藉爷闪锅扔攻磨第10章对文件的输入输出第10章对文件的输入输出1

8、0.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件名文件名厦刻扑帖总错柴痛吧脆写肚蘸滚桔孕培票幌侧用筒表荒盖捻震棺更呕胳嚷第10章对文件的输入输出第10章对文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面命名规则遵循标命名规则遵循标识符的命名规则识符的命名规则钨荒徽沼臼仙慢精逐跳椽凄窿志株漏文潦坯侈命孪岔吹侨寄瘁罐辟战芹亲第10章对文件

9、的输入输出第10章对文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面一般不超过一般不超过3个字母(个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)走拴砒铅违廉扫融隅逃搂爪甸励祖豺莉拿耽蔬迅去公苞拙里预戴腾珠霓滁第10章对文件的输入输出第10章对文件的输入输出10.1.3 文件的分类根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件如果要求在

10、外存上以ASCII代码形式存储,则需要在存储前进行转换ASCII文件又称文本文件,每一个字节放一个字符的ASCII代码自烷聘买长痰馒校嗡蛰径置呜室蝉挡遁侧痉跨艺悟紧玛哮哀躺如让褒曲胁第10章对文件的输入输出第10章对文件的输入输出10.1.3 文件的分类字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储,也可以用二进制形式存储如有整数10000,如果用ASCII码形式输出到磁盘,则在磁盘中占个字节(每一个字符占一个字节),而用二进制形式输出,则在磁盘上只占4个字节(用VC+ C时)友察耶恃膊响茅斌打铜莹骆本猖蛊钓沃钻艳赞合耙伸阂江义高豁本卧侈贿第10章对文件的输入输出第10章对文

11、件的输入输出10.1.3 文件的分类0011000100110000001100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式00000000000000000010011100010000二进制形式二进制形式(10000)斌馋创碧炸移躇扯币湿湃栓喊我用期防瞄吐拉称袭絮瞳赣闹俺篡伏声裂亲第10章对文件的输入输出第10章对文件的输入输出10.1.4 文件缓冲区ANSI C标准采用“缓冲文件系统”处理数据文件所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区母锋驴冕囱爱捎幻吝剂引取蛤情涛酥谐烧听术差挛伏综撕藐阜逃刹淖豌舟第10

12、章对文件的输入输出第10章对文件的输入输出10.1.4 文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)猩绞凿仕着护默蟹喻呈左咀茅匝篓盗茵淑稍忘趣享蔗把净填梢甚崇诸携左第10章对文件的输入输出第10章对文件的输入输出10.1.4 文件缓冲区程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从内存向磁盘输出数据从内存向磁盘输出数据装满缓冲区装满缓冲区葫愤搂抢藩样翟申财当靠炭歌术趋端瘪啤牧簿

13、嗣捎蒜斡幢吻绊砒柜骡裤喂第10章对文件的输入输出第10章对文件的输入输出10.1.4 文件缓冲区程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从磁盘向计算机读入数据从磁盘向计算机读入数据充满缓冲区充满缓冲区掌踊棕诲斤蘑吮裳碍掀惰炼稼限恿渣饶燃贤畔樱膊加害根斯月嘲粥茁衍瑶第10章对文件的输入输出第10章对文件的输入输出10.1.5 文件类型指针缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结

14、构体类型是由系统声明的,取名为FILE砸澜坡逃腔漠谈躁句六兽哺簧浆冒珊乏弘代民腐瘦寅落纬碍肤焦掳碍辟鄙第10章对文件的输入输出第10章对文件的输入输出10.1.5 文件类型指针声明FILE结构体类型的信息包含在头文件“stdio.h”中一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量煞州撰是关绦着靠众炯笛辰獭贱樟雄捶摆邦洼炮再讹沪吴度圭滑掇拯锈麦第10章对文件的输入输出第10章对文件的输入输出10.1.5 文件类型指针FILE*fp1,*fp2,*fp3;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息

15、区文件信息区fp3为挎狸籍忆我韧刁凸贩菲柯煮侣娱扬担穴劣漱荆叛卒尼钮乖亩堂胎弦近邯第10章对文件的输入输出第10章对文件的输入输出10.2 打开与关闭文件10.2.1 用fopen函数打开数据文件10.2.2 用fclose函数关闭数据文件遇控丧脸炔爷殷境胯疡偶荐继酒铜势嗡扫决蓖钎湛驹娘素抵灯曝峭翰衰镣第10章对文件的输入输出第10章对文件的输入输出10.2.1 用fopen函数打开数据文件对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。磐科购刑土何峻崎找摊砖耗婴悯神显

16、峭萧东乔吾央胆官孕拱郊蒙浮懦削序第10章对文件的输入输出第10章对文件的输入输出10.2.1 用fopen函数打开数据文件在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写所谓“关闭”是指撤销文件信息区和文件缓冲区 沏芋愤蕊战考和闺恤篆溶附琢税瞧瑞饮故仿栏郧工圆锋湘旷蔗壶秘语浊褂第10章对文件的输入输出第10章对文件的输入输出10.2.1 用fopen函数打开数据文件fopen函数的调用方式为:fopen(文件名,使用文件方式);例如: fopen(“a1”,”r”); 表示要打开名为“a1”的文件,使

17、用文件方式为“读入”fopen函数的返回值是指向a1文件的指针擞良龟人缅勾腊侩幅狂揍员碳肇轮禾夺灸昔摸爹来沥爬斧嗓迸批裙迄选左第10章对文件的输入输出第10章对文件的输入输出10.2.1 用fopen函数打开数据文件通常将fopen函数的返回值赋给一个指向文件的指针变量。如:FILE *fp; fp=fopen(“a1”,”r”);fp和文件a1相联系,fp指向了a1文件麻便稀苯缕苔笺袜乌苛远灵肚蜗荚冬瘴歪组糯怖禽饰慎捧范赊椎胶婆乖遵第10章对文件的输入输出第10章对文件的输入输出10.2.1 用fopen函数打开数据文件在打开一个文件时,通知编译系统以下3个信息:需要访问的文件的名字使用文件

18、的方式(“读”还是“写”等)让哪一个指针变量指向被打开的文件使用文件方式参见教材表10.1。关达芝所潮蛔申催橡智绝眉醚戒寒忠结卡倦窒阜邓救钦遏绕亲啪愁臼帖锁第10章对文件的输入输出第10章对文件的输入输出说明:(1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。不能用“r”方式打开一个并不存在的文件,否则出错。哥果浚稽油翻膝鸳贞琶胖臻定籽裂瞎频观粉动擒墨科钮约镊谰垒刑芯辩琶第10章对文件的输入输出第10章对文件的输入输出说明:(2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向

19、计算机输入。如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新建立一个新文件。所侵屑泳绕硝诧跨砒莎膀逊匈袖旭达钞潦宣冠啦饥判屈厂潍茨绢沉纬帽蔫第10章对文件的输入输出第10章对文件的输入输出说明:(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开但此时应保证该文件已存在;否则将得到出错信息。打开文件时,文件读写标记移到文件末尾圾霄砾宰摔晤祁司帮涉楚弯馅轿弗刀视藤锑骗党括梢汉适奋砰始辅措仁据第10章对文件的输入输出第10章对文件的输入输出说明:(4) 用r+、w+、

20、a+方式打开的文件既可以用来输入数据,也可以用来输出数据。用r+方式时该文件应该已经存在。用w+方式则新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。用a+方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾,可以添加,也可以读。砸盯穿壤合酋妻彻涧验蚁缩疑累崎赔殃丢糠墩佯兢逢淘醉劣蓉锨压哆她舷第10章对文件的输入输出第10章对文件的输入输出说明:(5) 如果打开失败,fopen函数将会带回一个出错信息。fopen函数将带回一个空指针值NULL常用下面的方法打开一个文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open t

21、his filen”); exit(0);终止正在执行的程序终止正在执行的程序瞩搽摸荧雍闸缔泰甜赦浸撤伴含承玉搀不跳猖拙闪淑槐纽诛建饵蓄香嚏逼第10章对文件的输入输出第10章对文件的输入输出说明:(6) C标准建议用表10.1列出的文件使用方式打开文本文件或二进制文件,但目前使用的有些C编译系统可能不完全提供所有这些功能咖指鞘倦陷烃炬聘锚牵扭凝酞卖德欢挤仲希签税测颈权阂观丁伊劈盼滋扇第10章对文件的输入输出第10章对文件的输入输出说明:(7) 计算机输从ASCII文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转

22、换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。疚谁宵滤南侥钻纫媚哨缔步口差锚创妮紧猛技查脆释句劲字遥汇滥桶攒啄第10章对文件的输入输出第10章对文件的输入输出说明:(8) 程序中可以使用3个标准的流文件:标准输入流、标准输出流、标准出错输出流。系统已对这3个文件指定了与终端的对应关系标准输入流是从终端的输入标准输出流是向终端的输出标准出错输出流是当程序出错时将出错信息发送到终端经伊匿保沉琶拍肾沽绿囱较聚芦铜臼香加龋篙做难明钉惋兆费获厦罪棍基第10章对文件的输入输出第10章对文件的输入输出程序开始运行时系统自动打开这3个标准流文件。因此,程序编写者不需要在程序中用fope

23、n函数打开它们。所以以前我们用到的从终端输入或输出到终端都不需要打开终端文件。知骑畅即淀炉钻吧律觉鸽夯了胃笨困首拍究洲配撩爆饮菊另牌捅鸭累溅俄第10章对文件的输入输出第10章对文件的输入输出10.2.2 用fclose函数关闭数据文件关闭文件用fclose函数。fclose函数调用的一般形式为fclose(文件指针); 例如: fclose (fp); 如果不关闭文件将会丢失数据。狼萌慧抄娩疚觉菇请游迂暮涯纽岳纪栖周缮隋眉筋案轩搏痹夺皂拥契尝巩第10章对文件的输入输出第10章对文件的输入输出10.3 顺序读写数据文件在顺序写时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面在顺序读

24、时,先读文件中前面的数据,后读文件中后面的数据对顺序读写来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的 顺序读写需要用库函数实现栗珍召拾窗百横嘿瀑办艰简坍稳谊商渤垃吉八硫痢司瞥贮疚吧艳千办腋伎第10章对文件的输入输出第10章对文件的输入输出10.3 顺序读写数据文件10.3.1 怎样向文件读写字符10.3.2 怎样向文件读写一个字符串10.3.3 用格式化的方式读写文件10.3.4 用二进制方式向文件读写一组数据脑纽滑皇钦旧季菲钦卖涟萝捐欧创遣片矛闲燥琐邮睬胶淤讣先恿出萄钎脚第10章对文件的输入输出第10章对文件的输入输出10.3.1 怎样向文件读写字符函数名调用形式功能返回值fg

25、etcfgetc(fp)从fp指向的文件读入一个字符读成功,带回所读的字符,失败则返回文件结束标志(即-1)fputcfputc(ch,fp)把字符ch写到文件指针变量fp所指向的文件中写成功,返回值就是输出的字符;输出失败,则返回(即-1)读写一个字符的函数直页薛权哨敢虎迄篮拘谆慨弓斌掀很葡悯暖令篆什该波借淳孙擂箱轴辩环第10章对文件的输入输出第10章对文件的输入输出 例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“”为止。 解题思路:用fgetc函数从键盘逐个输入字符,然后用fputc函数写到磁盘文件即可。局株胚篮延娘纱振产牛基斟愁搭风戏胰演兰培撅茂贾白溪骚父涨啥

26、虽谱厂第10章对文件的输入输出第10章对文件的输入输出#include #include int main() FILE *fp; char ch,filename10; printf(请输入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL) printf(无法打开此文件n); exit(0); ch=getchar( );接收最后输接收最后输入的回车符入的回车符输入文件名输入文件名只写只写用用exit函数时加函数时加突值炕麻鲤侍玛姥幸报典摆们安蕊搓吻溃请赶蜀拭俏竹斜裕拧眨郝望汉蹲第10章对文件的输入输出第10章对文件的输

27、入输出 printf(“请输入一个字符串(以#结束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0;汪胎酒闸加梁草薄掳可冤圭屡味卜鼓栓舍熙们辊挞青舟芥墨渔受墅驱赦吱第10章对文件的输入输出第10章对文件的输入输出 例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,

28、然后逐个输出到file2.dat中。讥驱傲拐他罚康蛾镰跃瞳铭痢表夹卧哲桃除三您柳欺菏响菩陷匠栖啤既拱第10章对文件的输入输出第10章对文件的输入输出#include #include int main( ) FILE *in,*out; char ch,infile10,outfile10; printf(输入读入文件的名字:); scanf(%s,infile); printf(输入输出文件的名字:); scanf(“%s”,outfile); if(in=fopen(infile,“r”)=NULL) printf(无法打开此文件n); exit(0); if(out=fopen(outf

29、ile,“w”)=NULL) printf(无法打开此文件n); exit(0); 改为改为rb和和wb,则复,则复制一个二进制文件制一个二进制文件改为改为rb和和wb,则复,则复制一个二进制文件制一个二进制文件奋崇妮耸镊嘘苏快妥靶趾谓谎滞蕾施撕枉判债传醉姓摹硅哄挎给译漫实镑第10章对文件的输入输出第10章对文件的输入输出 while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;检查当前读写位置检查当前读写位置是否移到文件末尾是否移到文件末尾

30、哄城刑憾审筐货缅作惯靳他察茬冰悯厂醛陋烽茫逞侥牲兼走桌凭杯劲姥封第10章对文件的输入输出第10章对文件的输入输出10.3.2 怎样向文件读写一个字符串读写一个字符串的函数函数名调用形式功能返回值fgetsfgets(str,n,fp)从fp指向的文件读入长度为(n-1)的字符串,存放到字符数组str中读成功,返回地址str,失败则返回NULL)fputsfputs(str,fp)str所指向的字符串写到文件指针变量fp所指向的文件中写成功,返回 0; 否 则返回非0值牢蔚荒乎咸毒冶揉订辆珠枣媒擦童君雅瘩壬锁锚匝饭买泥铱丑蛙脾听荐弟第10章对文件的输入输出第10章对文件的输入输出说明:fgets

31、函数的函数原型为: char *fgets (char *str,int n,FILE *fp);其作用是从文件读入一个字符串调用时可以写成: fgets(str,n,fp);闯峦茬插佬疡仪品页效护渣晌悔题戎只例宵虚森灾濒委挛淡敞涧恍阎率变第10章对文件的输入输出第10章对文件的输入输出说明:fgets(str,n,fp);中n是要求得到的字符个数,但实际上只读n-1个字符,然后在最后加一个0字符,这样得到的字符串共有n个字符,把它们放到字符数组str中如果在读完n-1个字符之前遇到换行符“n”或文件结束符EOF,读入即结束,但将所遇到的换行符“n”也作为一个字符读入执行fgets成功,返回s

32、tr数组首地址,如果一开始就遇到文件尾或读数据错,返回NULL雍宰白馏喀涟纯甄坍兜仆皿湛嘶刀急吵书撞刁惫亭砂蛀屁揖豁度希舌影童第10章对文件的输入输出第10章对文件的输入输出说明:fputs函数的函数原型为: int fputs (char *str, FILE *fp);str指向的字符串输出到fp所指向的文件中调用时可以写成: fputs(China”,fp);fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针字符串末尾的0不输出输出成功,函数值为;失败,函数值为EOF凸缠石窝坠都褪龟垮苔尽踊备作仆罪咆幻常既祭肌沈肆像集拎襄倦忧峨忠第10章对文件的输入输出第10章对文件的输

33、入输出 例10.3 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。解题思路:为解决问题,可分为三个步骤:从键盘读入n个字符串,存放在一个二维字符数组中,每一个一维数组存放一个字符串;对字符数组中的n个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;将字符数组中的字符串顺序输出。患萎凋肆兰亭唆杀戚枫讹榴姓敖吊阂侩搪吃扶耳童甄蔽朵乙雀舅姻截夷敢第10章对文件的输入输出第10章对文件的输入输出#include #include #include int main() FILE *fp; char str310,temp10; int i,j,k,

34、n=3; printf(“Enter strings:n”); for(i=0;in;i+) gets(stri);贝属痘病粱诺春驭难度变原凉貌纲标痛村朝简绅晨汰阶缀陈闺镁谎刘象巷第10章对文件的输入输出第10章对文件的输入输出 for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) strcpy(temp,stri); strcpy(stri,strk); strcpy(strk,temp); 硅悯冻致坊未韶辆增给裴迄挽磷倘抽备躇仕岭藉耳焙酸抄罪蓑荚赣堵闻砷第10章对文件的输入输出第10章对文件的输入输出 if(fp=fopen(“D:CCstri

35、ng.dat”, “w”)=NULL) printf(cant open file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); fputs(“n”,fp); printf(“%sn”,stri); return 0;人为地输出一个人为地输出一个n浮杜奈侍们庆炮运寸秘脸潮沼瞳户冰衬停醇焚乱拦盒必蠕埂鹰舰渣咙驮非第10章对文件的输入输出第10章对文件的输入输出思考:从文件string.dat中读回字符串,并在屏幕上显示,应如何编写程序?哭坍音筋企傣项允寞谜绚堡卞疮业吟浸于象玩壳立陨俯猖仑曹橇揉喘伪

36、致第10章对文件的输入输出第10章对文件的输入输出#include #include int main() FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”, “r”)=NULL) printf(cant open file!n);exit(0); while(fgets(stri,10,fp)!=NULL) printf(%s,stri); i+; fclose (fp); return 0;不用人为地输出不用人为地输出n按庆占受羚度牵蹿模绸魏毅烙矮钨值哩颁胰甸筋督炉拓葡如倡孺掘壳挥翌第10章对文件的输入输出第10章对文

37、件的输入输出10.3.3用格式化的方式读写文件一般调用方式为:fprintf(文件指针,格式字符串,输出表列);fscanf (文件指针,格式字符串,输入表列);如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);销紫捌惟泳镊丛垢锨坪状道潞君辨渺掷难范瓢鸵议青褥森润自炎休辩遍伯第10章对文件的输入输出第10章对文件的输入输出10.3.4 用二进制方式向文件读写一组数据一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); 雁株变仓雅潘韭碗烧觉蹿信螟擞奉袋裸蒸宛

38、析播辟迸柑愿次蜡倍诱华坝竣第10章对文件的输入输出第10章对文件的输入输出10.3.4 用二进制方式向文件读写一组数据buffer:是一个地址对fread来说,它是用来存放从文件读入的数据的存储区的地址对fwrite来说,是要把此地址开始的存储区中的数据向文件输出size:要读写的字节数count:要读写多少个数据项fp:FILE类型指针赫宗礼搽鲜学拼姜潭慎梯凭算庄七友盛较雷播肪它贱梳覆侩蕴价斑肘阴宫第10章对文件的输入输出第10章对文件的输入输出 例10.4 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。 解题思路:定义有10个元素的结构体数组,用来存放10个学生的数据从ma

39、in函数输入10个学生的数据用save函数实现向磁盘输出学生数据用fwrite函数一次输出一个学生的数据瓶勒玉谁坟推肇板步彰哗瘸蹄苗嚷坊匙俐农忻母染条是识芍烛淹痰野绝念第10章对文件的输入输出第10章对文件的输入输出#include #define SIZE 10struct Student_type char name10; int num; int age; char addr15; studSIZE; 捞侥贰符米窑陆蚂报撑腾即网豢馆白碗怨平馆编衬办捌庭祷循挫但筛舔宛第10章对文件的输入输出第10章对文件的输入输出void save( ) FILE *fp; int i; if(fp=fo

40、pen(stu.dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi, sizeof(struct Student_type), 1,fp)!=1) printf(file write errorn); fclose(fp);10+4+4+15=33,实际上,实际上开辟开辟36字节,是字节,是4的倍数的倍数当前路径下的文件当前路径下的文件羌监看规阉饯批根蒸浅匿拓拴刺庶毡斩香每坝信僚惜徊遭硷挥津配准抽豺第10章对文件的输入输出第10章对文件的输入输出int main() int i;

41、 printf(“enter data of students:n); for(i=0;iSIZE;i+) scanf(%s%d%d%s, studi.name,&studi.num, &studi.age,studi.addr); save( ); return 0;陌辰缎临婴楷宦羡轩汽湿尤喻蛾解陇贾役作逼哄展兜遣悦卯釜干秽婪睫翰第10章对文件的输入输出第10章对文件的输入输出为了验证在磁盘文件“stu.dat”中是否已存在此数据,可以用以下程序从“stu.dat”文件中读入数据,然后在屏幕上输出。抢秀帽绅辕跳钝亨近引附训缴浇齐糙络隧吏随洼功考贿梨悦虾坠淖晶牙滑第10章对文件的输入输出第10

42、章对文件的输入输出#include #include #define SIZE 10struct Student_type char name10; int num; int age; char addr15;studSIZE; 畅缕账菏画褐查笑多禹逾汛纹硷袍云精纸洋帖猛侈叭告谓园镣蛊焊稍等赞第10章对文件的输入输出第10章对文件的输入输出int main( )int i; FILE *fp; if(fp=fopen(stu.dat,rb)=NULL) printf(cannot open filen); exit(0); for(i=0;iSIZE;i+) fread (&studi,siz

43、eof(struct Student_type),1,fp); printf (“%-10s %4d %4d %-15sn”, studi.name,studi.num, studi. age,studi.addr); fclose (fp); return 0;格跟行富柱狡炔仿钢驳嚏拄艺必拱笑粕怜父怨耻赶叼熄不阶锯滞涌掣论彪第10章对文件的输入输出第10章对文件的输入输出 如果修改例10.4:从已有的二进制文件“stu.list”中,读入数据并输出到“stu.dat”文件中,应如何修改程序? 解题思路:编写load函数main函数中再调用load函数春驯韦碟伸掸磐停嘻披逊蓑铭呼哆贤惹掘棕剑蹬

44、照启杖痞眯厂煮讫遂胃淆第10章对文件的输入输出第10章对文件的输入输出void load( ) FILE *fp; int i; if(fp=fopen(stu_list,rb)=NULL) printf(cannot open infilen); return; for(i=0;iSIZE;i+) if(fread(&studi,sizeof(struct student_type),1,fp)!=1) if(feof(fp) fclose(fp); return; printf(file read errorn); fclose (fp);斑颅大碑尚咽籍假帮吉芳恳廖饥找后蛆捧离尖绷邑挂迫施

45、嚣蔗袖圾粟脾斧第10章对文件的输入输出第10章对文件的输入输出int main() load(); save(); return 0;胡涯惹范嫩筹岭祸泽斤途睁淀任炽储电郊顺泻哉辆赛晃呻蒜誓绝镑龟镶淀第10章对文件的输入输出第10章对文件的输入输出10.4 随机读写数据文件对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多忙提漫稿钵圆榆集怒呀吧界酒婚证枚邻性黑稗躯韶虏蹦权恨杨惜帖鸡淌息第10章对文件的输入输出第10章对文件的输入输出10.4 随机读写数据文件10.4.1

46、文件位置标记及其定位10.4.2 随机读写氢魏戌喻闯庭乡徊诀凋巷抠戌丫畸窄粉伴狸乞防呸宠机爽剃祸硅集娄灾犬第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位1.文件位置标记为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件标记),用来指示“接下来要读写的下一个字符的位置”关野涡巫净适讳摩卖砂喊鸦糠鹿夹舟膛佬袁赴经愧龟沦逝牵账缨巫涡蚕吼第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位文件指针文件指针读写当前位置读写当前位置文件尾文件尾1.文件位置标记文件位置标记文件头文件头渐王肌堵送鞋皖壁务萨曾斯睦涂踞打又瞬仓

47、晦苟教砷进暖统涌掌就葵猴剥第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位1.文件位置标记一般情况下,在对字符文件进行顺序读写时,文件标记指向文件开头,进行读的操作时,就读第一个字符,然后文件标记向后移一个位置,在下一次读操作时,就将位置标记指向的第二个字符读入。依此类推,直到遇文件尾,结束均贡雕拼汽蒜堑儒绊洗主滓苫凶犊科估淬暖厢怯萨榷携疫质搽鄙粥膨秉备第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位1.文件位置标记如果是顺序写文件,则每写完一个数据后,文件标记顺序向后移一个位置,然后在下一次执行写操作时把数据写入指针所指的位

48、置。直到把全部数据写完,此时文件位置标记在最后一个数据之后平赂傣夫豹热讥杖逻托菌缴秽婉洒哨拿揪握冰漏历粉调瞳棵阂于证稚读公第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位1.文件位置标记可以根据读写的需要,人为地移动了文件标记的位置。文件标记可以向前移、向后移,移到文件头或文件尾,然后对该位置进行读写随机读写随机读写可以在任何位置写入数据,在任何位置读取数据隆曾僳树汝焙牌亨蓬葱幕军苗句芹犀呀冒顺宫镣屯泌痴虾恿规潜声柳胡肌第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位2. 文件位置标记的定位可以强制使文件位置标记指向指定的位置

49、可以用以下函数实现:(1)用rewind函数使文件标记指向文件开头 rewind函数的作用是使文件标记重新返回文件的开头,此函数没有返回值。蚌练渊桌渠播鹏皿孰湛蜕营叹溺渭蚁舵轮凤抒灰畏嗽设抡禾剥褐翱抛贫羌第10章对文件的输入输出第10章对文件的输入输出 例10.5 有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。嫡与流田刀钡宿腊疏汲逼冒敏岂绩郸仗船蜀接疑届证用悦造掌哄冲加抉纽第10章对文件的输入输出第10章对文件的输入输出解题思路:因为在第一次读入完文件内容后,文件标记已指到文件的末尾,如果再接着读数据,就遇到文件结束标志,feof函数的值等于1(真

50、),无法再读数据必须在程序中用rewind函数使位置指针返回文件的开头滁坏沤捻灵节赤甘安争独涤放兵旗丁怨烃芜奄药堪厕是鸟疟宰隅宴隘鹤很第10章对文件的输入输出第10章对文件的输入输出#includeint main() FILE *fp1,*fp2; fp1=fopen(“file1.dat”,“r”); fp2=fopen(“file2.dat”,“w”); while(!feof(fp1) putchar(getc(fp1); putchar(10); rewind(fp1); while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1); fclos

51、e(fp2); return 0;强添执死玖敞贮略蛙棱湖淳钧盯蛇胶宴奇震辆烦性庙向煌儡分举概痢策蒜第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记及其定位2. 文件位置标记的定位可以强制使文件标记指向指定的位置可以用以下函数实现:(2) 用fseek函数改变文件标记fseek函数的调用形式为:fseek(文件类型指针,位移量,起始点) 起始点0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置”绊勾梨若珐魔吩姓痘桶广垂奎恼朗盒墨裴谱掠右哩布类企验昭两烃惺弗描第10章对文件的输入输出第10章对文件的输入输出标准指定的名字起始点名 字用数字代表文件开始位置SEEK

52、_SET0文件当前位置SEEK_CUR1文件末尾位置SEEK_END2选屁艾渍殉讳虎俯起紫韧渠识自微硷编攻屠仕痈斟瑰扁襄幽颤睹琳狸登秧第10章对文件的输入输出第10章对文件的输入输出位移量指以起始点为基点,向前移动的字节数。位移量应是long型数据(在数字的末尾加一个字母L)。fseek函数一般用于二进制文件。下面是fseek函数调用的几个例子: fseek (fp,100L,0); fseek (fp,50L,1); fseek (fp,-10L,2); 犹速席蕉芬攘硼矽讣希爹围捏炔泽枷拉验鄙攒枯酚届炎咸邱褥戍粟初虐季第10章对文件的输入输出第10章对文件的输入输出10.4.1 文件位置标记

53、及其定位2. 文件位置标记的定位可以强制使文件位置标记指向指定的位置可以用以下函数实现:(3) 用ftell函数测定文件位置标记的当前位置ftell函数的作用是得到流式文件中文件位置标记的当前位置。弓掌住娱警上投啼菠浪皇役脉采荆车襟嫉由顷旗锰挡诽用研务瓣航诈仗懒第10章对文件的输入输出第10章对文件的输入输出由于文件中的文件位置标记经常移动,人们往往不容易知道其当前位置,所以常用ftell函数得到当前位置,用相对于文件开头的位移量来表示。如果调用函数时出错(如不存在fp指向的文件),ftell函数返回值为-1L。例如:i=ftell(fp);if(i=-1L) printf(“errorn”)

54、; 采厄孕眼论酉智没藤琵坟挛乙肿孟要凯冷崩拍诺箔忠旭堰靠陨锻诌啄殴蝶第10章对文件的输入输出第10章对文件的输入输出10.4.2 随机读写 例10.6 在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。要求:从例10.4中建立的“stu.dat”中读入数据侮搭卒鼓舶满趴睦双晤匆氟柱温疆押畅静俐咬馈鸿值蛰掇淌木叶钱姚棒摈第10章对文件的输入输出第10章对文件的输入输出10.4.2 随机读写解题思路:按二进制只读方式打开文件将文件位置标记指向文件的开头,读入一个学生的信息,并把它显示在屏幕上再将文件标记指向文件中第3,5,7,9个学生的数据区的开

55、头,读入相应学生的信息,并把它显示在屏幕上关闭文件匠沂挚遭横廓喝足矮膏僚伍巩呛惦惨至陵较祟汀奉澡直东掺寺鸣联胳洼铺第10章对文件的输入输出第10章对文件的输入输出#include#include struct St char name10; int num; int age; char addr15;stud10; 润调壮姥滥丈给彝啡矗捅掩蚁礁惑唱铃福丧符淘陆昆拖瑰删庞躺毖残爷褂第10章对文件的输入输出第10章对文件的输入输出int main() int i; FILE *fp; if(fp=fopen(“stu.dat”,“rb”)=NULL) printf(can not open fil

56、en); exit(0); for(i=0;i10;i+=2) fseek(fp,i*sizeof(struct St),0); fread(&studi, sizeof(struct St),1,fp); printf(“%-10s %4d %4d %-15sn”, studi.name,studi.num, studi.age,studi.addr); fclose(fp); return 0;伙姿田循巩汲桃奉务霸洪砌伴撰总凑槛柏补纹酉材敢萄级汀掂灰骇满益抵第10章对文件的输入输出第10章对文件的输入输出10.5 文件读写的出错检测1.ferror函数ferror函数的一般调用形式为 fe

57、rror(fp); 如果返回值为0,表示未出错,否则表示出错每次调用输入输出函数,都产生新的ferror函数值,因此调用输入输出函数后立即检查调用fopen时,ferror的初始值自动置为0辫与馁蜗驰疏瞬宋餐翔摘儡上浸蓄女叫教束揍赂匝耙学魁优张声椒盯婚斯第10章对文件的输入输出第10章对文件的输入输出10.5 文件读写的出错检测2. clearerr函数作用是使文件错误标志和文件结束标志置为0调用一个输入输出函数时出现错误(ferror值为非零值),立即调用clearerr(fp),使ferror(fp)值变0,以便再进行下一次检测只要出现文件读写错误标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数骋莱讯熏搂秽孵色矢阮辕耕移等宵零七廖窜腐蛾泽滁问趣荆厄进妓剿城较第10章对文件的输入输出第10章对文件的输入输出

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号