《第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 什么是文件文件有不同的类型,在程序设计中,主要用到两种文件:(1)
2、 程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件的内容是程序代码。慕请叶樱嗡币姨驳肠讥贩灸悠瓮馈公恨愚活跪蒜才冠鬃碗枝晰篮粘蕴虑如第10章文件的输入输出第10章文件的输入输出10.1.1 什么是文件文件有不同的类型,在程序设计中,主要用到两种文件:(2) 数据文件。文件的内容不是程序,而是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。如一批学生的成绩数据,或货物交易的数据等。本章主要讨论的是数据文件根捍破怨焉鞠俘祷慨哇辈骄观泰蚤亢辰督倦甭意估趋锄槽部塔蹋腮柱暑溅第10章
3、文件的输入输出第10章文件的输入输出10.1.1 什么是文件在以前各章中所处理的数据的输入和输出,从终端的键盘输入数据,运行结果输出到终端显示器上常常需要将一些数据输出到磁盘上保存起来,以后使用这就要用到磁盘文件豹荔酗遮茨吐筑涂砰苯抬签钱巳歇衰颈嘉拇档怂妇孤弛皋栗膝禁目贿敌稀第10章文件的输入输出第10章文件的输入输出10.1.1 什么是文件操作系统把各种设备都统一作为文件处理从操作系统的角度看,每一个与主机相联的输入输出设备都看作是文件。例如,终端键盘是输入文件显示屏和打印机是输出文件算祖朔欣身雀鸦逊博赴穗菇牙装酝巢识扔炯渣学狐俩捶氓铅架减骡致狠蜡第10章文件的输入输出第10章文件的输入输出
4、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章文件的输入输出10.1.2 文件名文件要
7、有一个唯一的文件标识,以便用户识别和引用。文件标识包括三部分:(1)文件路径(2)文件名主干(3)文件后缀枯肾矩耸预贫贼钳哨怠挽庚魂唉镜膛汪腿瘦世胳臂瞥詹盔希布控赁蓉欺翅第10章文件的输入输出第10章文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件路径文件路径文件名主干文件名主干文件后缀文件后缀及盲蛋谩蛛续巫俩扬嗜玲绞寞住唉巫堂寂迢倍灵彻盟疡敢五诌管靴毗肺尊第10章文件的输入输出第10章文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的
8、位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面文件名文件名暗钙护亏鲜总权榨棘舷互圈催七骏丙媳购股票讹昭酥辩赐师宋赛钳痕勉沛第10章文件的输入输出第10章文件的输入输出10.1.2 文件名文件路径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面命名规则遵循标命名规则遵循标识符的命名规则识符的命名规则竣疑堰恤刨教传驹身砌魁航枪拴耳淌怀脆速允赎末懂椅箱总弟救握易奏拓第10章文件的输入输出第10章文件的输入输出10.1.2 文件名文件路
9、径表示文件在外部存储设备中的位置。如: D: CCtempfile1.dat表示file1.dat文件存放在D盘中的CC目录下的temp子目录下面一般不超过一般不超过3个字母(个字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)等)贼恩邹窑袁官掳渡砍际证贿砚原屠龙谗饭柱茅淫危胯肿廊冯阑闰切臣箱恢第10章文件的输入输出第10章文件的输入输出10.1.3 文件的分类根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换ASCII
10、文件又称文本文件,每一个字节放一个字符的ASCII代码思旁尊滤舜皮汉花屠涂掇砰豢侍页集沙僵钙妊皱吵特蔷埂攀作溃烷恨羹认第10章文件的输入输出第10章文件的输入输出10.1.3 文件的分类字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储,也可以用二进制形式存储如有整数10000,如果用ASCII码形式输出到磁盘,则在磁盘中占个字节(每一个字符占一个字节),而用二进制形式输出,则在磁盘上只占4个字节(用VC+ C时)忧咖詹伊痛旧屏蹭吐桂鼠多峡旧碟畸促冀芬骏党涕三缕逃镇午癣逛悔焉烽第10章文件的输入输出第10章文件的输入输出10.1.3 文件的分类001100010011000000
11、1100000011000000110000(1)(0)(0)(0)(0)ASCII形式形式00000000000000000010011100010000二进制形式二进制形式(10000)郧贱辩某殖烫杜察寅腾鄙该位参龟搞佐页搜禁板诱蹦荫饰误特臀给疯耍植第10章文件的输入输出第10章文件的输入输出10.1.4 文件缓冲区ANSI C标准采用“缓冲文件系统”处理数据文件所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区座露膨蠢如墙泡寂链谚袄着纺足甲湖武钎攒缄救狐兹罩褥较赋遁哎悲用埃第10章文件的输入输出第10章文件的输入输出10.1.4 文件缓冲区从内存向磁盘输
12、出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)秘彭埠蚂婴口并黎寥笛归献气彬劝浴婪闷原昧接券姓掐珊趟瓜箱喧寒官蜂第10章文件的输入输出第10章文件的输入输出10.1.4 文件缓冲区程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从内存向磁盘输出数据从内存向磁盘输出数据装满缓冲区装满缓冲区蹬革泞医造枫盾牺茎估了霄灵曲衣村锦比惧论廊派绩票泛喜抉亨燃块栗琳第10章文件的输入输出第10章文件的输入输出10.1.4 文
13、件缓冲区程序数据区程序数据区输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区磁盘磁盘从磁盘向计算机读入数据从磁盘向计算机读入数据充满缓冲区充满缓冲区怂竟攘邵勤裕樟让溉钨趋鞠陕笑结秆做婉探骑劝氰辗凸刷掐碉族瞅雀咆货第10章文件的输入输出第10章文件的输入输出10.1.5 文件类型指针缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE狼丙如述银灼劫婆日究档刊作勿司迹逾疽戈渗巨荡抑列级牲跟
14、尾棒踪阻褂第10章文件的输入输出第10章文件的输入输出10.1.5 文件类型指针声明FILE结构体类型的信息包含在头文件“stdio.h”中一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量鳃袍工奉陨治潮蝗殴潘世续瞻目小照镭泅表夯鳖碴缀答侵存宏一第帅膨蚌第10章文件的输入输出第10章文件的输入输出10.1.5 文件类型指针FILE*fp1,*fp2,*fp3;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息区文件信息区fp3闷参悄夸追鲤唬辙厕谭映惠探稳床捅挟回港旱放廷荆艾摔绑店凹慈渭塞庆第10章文件的输入
15、输出第10章文件的输入输出10.2 打开与关闭文件10.2.1 用fopen函数打开数据文件10.2.2 用fclose函数关闭数据文件亩杯屠辽佬残鹿横晦通扼保叠渺饮却嚣漠罪坷茸密绦佯胆做寡绍发租臆巧第10章文件的输入输出第10章文件的输入输出10.2.1 用fopen函数打开数据文件对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。羽绦铜糖浩秘科价盾书洲坠剪正愚命驻腕侠储孔祟堡轨棠嵌组赂疑否蜂炮第10章文件的输入输出第10章文件的输入输出10.2.1 用fopen函数打
16、开数据文件在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写所谓“关闭”是指撤销文件信息区和文件缓冲区 孕锹噬秧泡颗职购虱盒补妆窍懊捣修博砸馏岛砰肆括烩拂弗粒呸那习捞始第10章文件的输入输出第10章文件的输入输出10.2.1 用fopen函数打开数据文件fopen函数的调用方式为:fopen(文件名,使用文件方式);例如: fopen(“a1”,”r”); 表示要打开名为“a1”的文件,使用文件方式为“读入”fopen函数的返回值是指向a1文件的指针墟津轰验住纸戚涡肪兜遍福聘挨除舀称裴蜕镣成彩卜丑苫知惶
17、亥啪肌屉恕第10章文件的输入输出第10章文件的输入输出10.2.1 用fopen函数打开数据文件通常将fopen函数的返回值赋给一个指向文件的指针变量。如:FILE *fp; fp=fopen(“a1”,”r”);fp和文件a1相联系,fp指向了a1文件刁赴穿舞鱼促惕志董宽拌宪滴渡瓷谓桅疾摈卧拇肛睫借浸易狂茁持败绽墒第10章文件的输入输出第10章文件的输入输出10.2.1 用fopen函数打开数据文件在打开一个文件时,通知编译系统以下3个信息:需要访问的文件的名字使用文件的方式(“读”还是“写”等)让哪一个指针变量指向被打开的文件使用文件方式参见教材表10.1。枕艳玛欢攫检糯晃蹬抄潜怎谗程原缺
18、脐梢嗅贾疼冈瞥洋河迷盒诣赠怯祟椒第10章文件的输入输出第10章文件的输入输出说明:(1) 用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。不能用“r”方式打开一个并不存在的文件,否则出错。宫硅脐侍承利致津车访扫驭泽润抽郁稽忌蜘枷尧络初显卿峦生钳赴厌峨揪第10章文件的输入输出第10章文件的输入输出说明:(2) 用“w”方式打开的文件只能用于向该文件写数据(即输出文件),而不能用来向计算机输入。如果原来不存在该文件,则在打开文件前新建立一个以指定的名字命名的文件。如果原来已存在一个以该文件名命名的文件,则在打开文
19、件前先将该文件删去,然后重新建立一个新文件。捎漱宾轧鱼能缺症肠荒既豪勘轨狠建十丛轨泥刑趋聋牛讽仟凝壮豢闰霜透第10章文件的输入输出第10章文件的输入输出说明:(3) 如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开但此时应保证该文件已存在;否则将得到出错信息。打开文件时,文件读写标记移到文件末尾可姿比匣炮岂牙尤纱壬钡凄钓忽忿揍炭泞爪族本启喇菌敛雇媒腐医辑刁臭第10章文件的输入输出第10章文件的输入输出说明:(4) 用r+、w+、a+方式打开的文件既可以用来输入数据,也可以用来输出数据。用r+方式时该文件应该已经存在。用w+方式则新建立一个文件,先向此文件写数据,然后
20、可以读此文件中的数据。用a+方式打开的文件,原来的文件不被删去,文件读写位置标记移到文件末尾,可以添加,也可以读。瑞笛向林葛冷梳骸趴漫烈谷磁多宛券膏蛔榜吨娃馆晕帽本穷廓漏茹科惕涯第10章文件的输入输出第10章文件的输入输出说明:(5) 如果打开失败,fopen函数将会带回一个出错信息。fopen函数将带回一个空指针值NULL常用下面的方法打开一个文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0);终止正在执行的程序终止正在执行的程序父凝类纵鄂归嘿嫩育扇弘同赋纸妈引羊擂孜蚊荐市意小烽匿登瞪媚未题盖第
21、10章文件的输入输出第10章文件的输入输出说明:(6) C标准建议用表10.1列出的文件使用方式打开文本文件或二进制文件,但目前使用的有些C编译系统可能不完全提供所有这些功能惫涨夫赡腹蠢捣貉奎瘁弓胰妄囤驼售斯仑颓欣诞捏茧还垂彦怯鄂酪食蹋赊第10章文件的输入输出第10章文件的输入输出说明:(7) 计算机输从ASCII文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。峭审吾吸甸篇升代唆奈往悲持范蛙瑟酿活等萌民穷抓荷楞庙寞辙挛铣脑寡第10章文件的输入
22、输出第10章文件的输入输出说明:(8) 程序中可以使用3个标准的流文件:标准输入流、标准输出流、标准出错输出流。系统已对这3个文件指定了与终端的对应关系标准输入流是从终端的输入标准输出流是向终端的输出标准出错输出流是当程序出错时将出错信息发送到终端邓汝嘶谢扩最境筏昏肖淀橇攒哭杉赠骚艘挛铜缘郎鼎桓兼枣统坷腋咬辕色第10章文件的输入输出第10章文件的输入输出程序开始运行时系统自动打开这3个标准流文件。因此,程序编写者不需要在程序中用fopen函数打开它们。所以以前我们用到的从终端输入或输出到终端都不需要打开终端文件。顶够霓琼贬钓刊夫浆紧勘干肆食冗哥平韩孝娃订胎餐浙病完需烃杨缺酌访第10章文件的输入
23、输出第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 怎样向文件读写字符函数名调用形式功能返回值fgetcfgetc(fp)从fp指向的文件读入一个字符读成功,带回所读的字符,失败则返回文件结束标志(即-1)fputcfputc(ch,fp)把字符ch写到文件指针变量fp所指
25、向的文件中写成功,返回值就是输出的字符;输出失败,则返回(即-1)读写一个字符的函数筐殊悸抄汪体骋困佑俊绦衡尽妊骆旬孟懒膝凸祷充捧苞佐冠通若曲浇椭省第10章文件的输入输出第10章文件的输入输出 例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“”为止。 解题思路:用fgetc函数从键盘逐个输入字符,然后用fputc函数写到磁盘文件即可。弊关揣活蝎由烙端稗叛枚榔友惋淌恼权竖是仰扇雄副娄萧哗悲念娥速剿疵第10章文件的输入输出第10章文件的输入输出#include #include int main() FILE *fp; char ch,filename10; printf
26、(请输入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL) printf(无法打开此文件n); exit(0); ch=getchar( );接收最后输接收最后输入的回车符入的回车符输入文件名输入文件名只写只写用用exit函数时加函数时加蔷欣掖匈熊咬离蜂册表瞪盘起享谭浅簧棒粳纷斥磺凰琅牲泡澜赴下危笼又第10章文件的输入输出第10章文件的输入输出 printf(“请输入一个字符串(以#结束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getcha
27、r(); fclose(fp); putchar(10); return 0;编锡尉绝锰退惮番疗跺所淆格楚景丢箱举嗜瓤熔爹情斑掇牵邪耀雨析该瓶第10章文件的输入输出第10章文件的输入输出 例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。解题思路:处理此问题的算法是:从file1.dat文件中逐个读入字符,然后逐个输出到file2.dat中。架噬呜立勿川橡朗焉雁乾卉迅挑摄锤鳖生簇幼钢蝴彪鸡坷畴膨筒舰茄诱晶第10章文件的输入输出第10章文件的输入输出#include #include int ma
28、in( ) 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(outfile,“w”)=NULL) printf(无法打开此文件n); exit(0); 改为改为rb和和wb,则复,则复制一个二进制文件制一个二进制文件改为改为rb和和wb,则复,则复制一个二进制文件
29、制一个二进制文件万丙柑几欧蘑铱钎蛰木删滩呈泉茁溯凡副温仰帮杭惧肌劣欠宝寥娥娱业函第10章文件的输入输出第10章文件的输入输出 while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;检查当前读写位置检查当前读写位置是否移到文件末尾是否移到文件末尾篷朽慈恢腺检睬新促怂纤钱戊镑搂搽仟涡攒印海了蛙剧币矢澎京横跃烂冲第10章文件的输入输出第10章文件的输入输出10.3.2 怎样向文件读写一个字符串读写一个字符串的函数函数名调用形式功能返回值fgets
30、fgets(str,n,fp)从fp指向的文件读入长度为(n-1)的字符串,存放到字符数组str中读成功,返回地址str,失败则返回NULL)fputsfputs(str,fp)str所指向的字符串写到文件指针变量fp所指向的文件中写成功,返回 0; 否 则返回非0值叛跟式挛踢疯爱楷凉愈理宏瓦沟特若凿苑狼充脖朋荣倡浑爷炉间菏羹卜潍第10章文件的输入输出第10章文件的输入输出说明:fgets函数的函数原型为: char *fgets (char *str,int n,FILE *fp);其作用是从文件读入一个字符串调用时可以写成: fgets(str,n,fp);步鸭汞蹋侗臃荒董黔征趟篱啦做珐曙
31、廊薪侮赢仇谆骇留憨厉拣磊缨鹰惰学第10章文件的输入输出第10章文件的输入输出说明:fgets(str,n,fp);中n是要求得到的字符个数,但实际上只读n-1个字符,然后在最后加一个0字符,这样得到的字符串共有n个字符,把它们放到字符数组str中如果在读完n-1个字符之前遇到换行符“n”或文件结束符EOF,读入即结束,但将所遇到的换行符“n”也作为一个字符读入执行fgets成功,返回str数组首地址,如果一开始就遇到文件尾或读数据错,返回NULL磨疡企眷宏羊颅睦桐拴随恼按棱宇挚蚌系关狡挖室耙电普绩茬块呕崖逻陨第10章文件的输入输出第10章文件的输入输出说明:fputs函数的函数原型为: int
32、 fputs (char *str, FILE *fp);str指向的字符串输出到fp所指向的文件中调用时可以写成: fputs(China”,fp);fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针字符串末尾的0不输出输出成功,函数值为;失败,函数值为EOF醒艺交串渭晶猖盼策悼捏焊摹塌嘻乍朔滔首阑掳奸靠逃土浑馁赠痕绷钳快第10章文件的输入输出第10章文件的输入输出 例10.3 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。解题思路:为解决问题,可分为三个步骤:从键盘读入n个字符串,存放在一个二维字符数组中,每一个一维数组存放一个
33、字符串;对字符数组中的n个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;将字符数组中的字符串顺序输出。炯匡沪淹厚衣莆页集溉虱浓借攻僻司窝扩镇灌念胚驮筷物笔拯刀徒挠殃粘第10章文件的输入输出第10章文件的输入输出#include #include #include int main() FILE *fp; char str310,temp10; int i,j,k,n=3; printf(“Enter strings:n”); for(i=0;in;i+) gets(stri);吩扦抽菏栽羽囚疥克讳备快勘杰俱焰恿贸掷她瀑排不神皱杜么而蛾术垒吵第10章文件的输入输出第10章文件的输入输出
34、 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:CCstring.dat”, “w”)=NULL) printf(cant open file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); f
35、puts(“n”,fp); printf(“%sn”,stri); return 0;人为地输出一个人为地输出一个n投耘碱伪憋趟效伤今淡萝乍耸拽假碳吾另蓄掖习援统琉融墓枚毛火腆砚疑第10章文件的输入输出第10章文件的输入输出思考:从文件string.dat中读回字符串,并在屏幕上显示,应如何编写程序?等谁深裳佐交挽轿隘骡乘幸防劈待咯纪翱眉胳住河哟课牡亦拱洁缺占贿馈第10章文件的输入输出第10章文件的输入输出#include #include int main() FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”, “r”)
36、=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章文件的输入输出10.3.3用格式化的方式读写文件一般调用方式为:fprintf(文件指针,格式字符串,输出表列);fscanf (文件指针,格式字符串,输入表列);如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,
37、”%d,%f”,&i,&f);登闽护物进庶指笋雅星枪畅凯访锥怪湘陇县毕费曰阴园痘弱淫馏寂寞哑血第10章文件的输入输出第10章文件的输入输出10.3.4 用二进制方式向文件读写一组数据一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); 拴返陷哺骄恭卷刮福糕衫恬甲颓掺赎熟氰歪垦姑普搪南担侦樊旅烤源赞诽第10章文件的输入输出第10章文件的输入输出10.3.4 用二进制方式向文件读写一组数据buffer:是一个地址对fread来说,它是用来存放从文件读入的数据的存储区的地址对fwrite来说,是要把此地址开始的存储区中的数
38、据向文件输出size:要读写的字节数count:要读写多少个数据项fp:FILE类型指针仕涝雇斡赦潞袭儿卜亥竹茄降厩媳亲珐愿贮哼浩断食欠尔掂凯撵音浮戳瓮第10章文件的输入输出第10章文件的输入输出 例10.4 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。 解题思路:定义有10个元素的结构体数组,用来存放10个学生的数据从main函数输入10个学生的数据用save函数实现向磁盘输出学生数据用fwrite函数一次输出一个学生的数据初斥辊砖渍险霜循森喉镑伐仟咖胃器舌块呆追抓天菌寸报军躇卤踏串镊藉第10章文件的输入输出第10章文件的输入输出#include #define SIZE
39、10struct Student_type char name10; int num; int age; char addr15; studSIZE; 瘪寓抬扮叠邀概塑宗边迂锈付波像挺听涡暴秉糙血次挚酵雕余咽钡衔傍只第10章文件的输入输出第10章文件的输入输出void save( ) FILE *fp; int i; if(fp=fopen(stu.dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi, sizeof(struct Student_type), 1,fp)!=1)
40、printf(file write errorn); fclose(fp);10+4+4+15=33,实际上,实际上开辟开辟36字节,是字节,是4的倍数的倍数当前路径下的文件当前路径下的文件归悍炔泅去呛武擎哄徒挑钉道骂颊汁烧依逛摊臃吼持司搔负愤坡却郴涕去第10章文件的输入输出第10章文件的输入输出int main() int i; 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
41、;程沙腋迷白镣煽种僧犯姐拯淄停壬莲纱乌障履七痕供袒挂勺锹棠呸仿磐兆第10章文件的输入输出第10章文件的输入输出为了验证在磁盘文件“stu.dat”中是否已存在此数据,可以用以下程序从“stu.dat”文件中读入数据,然后在屏幕上输出。稻焉屏莎隧肃戮王纤烯旭藕门郴猾舀瓦明够条油予剩缘约屁损匣献毡毫易第10章文件的输入输出第10章文件的输入输出#include #include #define SIZE 10struct Student_type char name10; int num; int age; char addr15;studSIZE; 仲贞杨市腕防珠峭麦峻砰眶映颠驹稍染效抄咯搔筋仕
42、饥咨伺最辈抚榆塔挡第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,sizeof(struct Student_type),1,fp); printf (“%-10s %4d %4d %-15sn”, studi.name,studi.num, studi. age,studi.addr); fclose (fp); return 0;罐剔忠坷煤疚琳故
43、蝇缩压歧慧尧硅垒园恰袜菜裁鱼恼无阉沃几禁滁玖嗣冲第10章文件的输入输出第10章文件的输入输出 如果修改例10.4:从已有的二进制文件“stu.list”中,读入数据并输出到“stu.dat”文件中,应如何修改程序? 解题思路:编写load函数main函数中再调用load函数忆乒侄檀驳盐抉逛页冯梆歼衍澡汇镶话央滋速驮莫礼嵌娃猛方停栗晾见月第10章文件的输入输出第10章文件的输入输出void load( ) FILE *fp; int i; if(fp=fopen(stu_list,rb)=NULL) printf(cannot open infilen); return; for(i=0;iSI
44、ZE;i+) if(fread(&studi,sizeof(struct student_type),1,fp)!=1) if(feof(fp) fclose(fp); return; printf(file read errorn); fclose (fp);连复八堂淖蔡降裹贬拜附狞另开擦魂僧始势富宅仲构吮释架展淡榷未槽及第10章文件的输入输出第10章文件的输入输出int main() load(); save(); return 0;缓殉迄架面酞仅捅创磷鞭衙把巳绳附徐键料茹哆党扭香秘绸跺摧了筏乎跋第10章文件的输入输出第10章文件的输入输出10.4 随机读写数据文件对文件进行顺序读写比较容
45、易理解,也容易操作,但有时效率不高随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多徘加氰蛙擎聊妮宣厅栅月掸诉琵甲凉兽十凸存姨荷兼店傻技蛀潜欢银哥健第10章文件的输入输出第10章文件的输入输出10.4 随机读写数据文件10.4.1 文件位置标记及其定位10.4.2 随机读写急恬纵固也肥炽矽喷鲸寒烩蚕倚坎墨倒惮被轩醉陵袭持瞒捞糠委英衔绣侧第10章文件的输入输出第10章文件的输入输出10.4.1 文件位置标记及其定位1.文件位置标记为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件标记),用来指示“接下来要读写
46、的下一个字符的位置”狮碱禽愿智称绦增兰蓖违挑狞埂镁倒祥淬押钻隘凝德履呆骋素盂救假栗诬第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 文件位置标记及其定位2. 文件位置标记的定位可以强制使文件位置标记指向指定的位置可以用以下函数实现:(1)用rewind函数使文件标记指向文件开头 rewind函数的作用是使文件标记重新返回文件的开头,此函数没有返回值。颜罢耀嘘俱卯子鲸汹欢辱袖葬淀爵沮臀发恐癣辫铲探傅溜集肠姬徒杀筑劳第10章文件的输入输出第10章文件的输入输出 例10.5 有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上
49、,第二次把它复制到另一文件上。津老坷烁匣否腆棕明居频培番哗辙保截邱鱼勋掸眷沂掘迹摔审袁芥脊操棘第10章文件的输入输出第10章文件的输入输出解题思路:因为在第一次读入完文件内容后,文件标记已指到文件的末尾,如果再接着读数据,就遇到文件结束标志,feof函数的值等于1(真),无法再读数据必须在程序中用rewind函数使位置指针返回文件的开头拱墨画烷掣肯彦绣颓霄帧刻送女控苍胃柒展前圾峙们嘿肇妮星抖违岭荣肯第10章文件的输入输出第10章文件的输入输出#includeint main() FILE *fp1,*fp2; fp1=fopen(“file1.dat”,“r”); fp2=fopen(“fil
50、e2.dat”,“w”); while(!feof(fp1) putchar(getc(fp1); putchar(10); rewind(fp1); while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); return 0;佛唾东邢雄龋薄坠给胳城土忱泽央漆仆份枢李息谐袭疯帛轻孔离雌娘拂剩第10章文件的输入输出第10章文件的输入输出10.4.1 文件位置标记及其定位2. 文件位置标记的定位可以强制使文件标记指向指定的位置可以用以下函数实现:(2) 用fseek函数改变文件标记fseek函数的调用形式为:fseek(文件类型
51、指针,位移量,起始点) 起始点0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置”缠伦锌怯哪哀怯迄动朽阁稽才呕敦神倦凋寿甄痞发评缸阎耍待巡上纳暇亏第10章文件的输入输出第10章文件的输入输出标准指定的名字起始点名 字用数字代表文件开始位置SEEK_SET0文件当前位置SEEK_CUR1文件末尾位置SEEK_END2童屉酷徽甫串嘶厘氟磷在湍柱贡承址斯黄扇矾画笑裔寐畴猴与艾览阉陋裸第10章文件的输入输出第10章文件的输入输出位移量指以起始点为基点,向前移动的字节数。位移量应是long型数据(在数字的末尾加一个字母L)。fseek函数一般用于二进制文件。下面是fseek函数调用的几个例子:
52、 fseek (fp,100L,0); fseek (fp,50L,1); fseek (fp,-10L,2); 大律注宠匣婚厢暮麦臣含倔拱缀清瞬湿铸甫睛讼操姆藉颜白安慢呢凤绊顶第10章文件的输入输出第10章文件的输入输出10.4.1 文件位置标记及其定位2. 文件位置标记的定位可以强制使文件位置标记指向指定的位置可以用以下函数实现:(3) 用ftell函数测定文件位置标记的当前位置ftell函数的作用是得到流式文件中文件位置标记的当前位置。仟瘁鸵才膜氰茶傀押陇态诽墅萝乙濒舰捌递谆泌颤氢砧赋扮粳酵辙遍踩宁第10章文件的输入输出第10章文件的输入输出由于文件中的文件位置标记经常移动,人们往往不容
53、易知道其当前位置,所以常用ftell函数得到当前位置,用相对于文件开头的位移量来表示。如果调用函数时出错(如不存在fp指向的文件),ftell函数返回值为-1L。例如:i=ftell(fp);if(i=-1L) printf(“errorn”); 走昆锡也化奴渤寅便拎幕糯擞峦鹊龚厂尊呼岸柬鲁堑厘烯吐纂裸兜敬钠铅第10章文件的输入输出第10章文件的输入输出10.4.2 随机读写 例10.6 在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。要求:从例10.4中建立的“stu.dat”中读入数据蕴剥庚睡顺俱辛赏电搜皿掣腔苔碾眺骨猾啡碾雷孰描宇囚崇
54、抬扦块砾痕甚第10章文件的输入输出第10章文件的输入输出10.4.2 随机读写解题思路:按二进制只读方式打开文件将文件位置标记指向文件的开头,读入一个学生的信息,并把它显示在屏幕上再将文件标记指向文件中第3,5,7,9个学生的数据区的开头,读入相应学生的信息,并把它显示在屏幕上关闭文件檬闷残讳辊傣富晤旷螺帖赴逊蜕爸烹骤激恍唯让撵诌歇自泼洱沸咕祁橡锑第10章文件的输入输出第10章文件的输入输出#include#include struct St char name10; int num; int age; char addr15;stud10; 究炙皱朋蹬绷虑赴儡辽鞍甥琼宣争艰曙淋堂岛编归诛岔磁
55、蜡篮蚀塔盈宰詹第10章文件的输入输出第10章文件的输入输出int main() int i; FILE *fp; if(fp=fopen(“stu.dat”,“rb”)=NULL) printf(can not open filen); 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
56、(fp); return 0;澈僳种楼冒揽镇版牺以暖酒抖珍命咎庭蒜瞪延章史伊活篆厉膛树约骆涉蒲第10章文件的输入输出第10章文件的输入输出10.5 文件读写的出错检测1.ferror函数ferror函数的一般调用形式为 ferror(fp); 如果返回值为0,表示未出错,否则表示出错每次调用输入输出函数,都产生新的ferror函数值,因此调用输入输出函数后立即检查调用fopen时,ferror的初始值自动置为0轩求毒强犊炔锚蓬脂吐巧吐块像知猿袭柳纹梳脓纹翁另屋闲按漳范闷沛睛第10章文件的输入输出第10章文件的输入输出10.5 文件读写的出错检测2. clearerr函数作用是使文件错误标志和文件结束标志置为0调用一个输入输出函数时出现错误(ferror值为非零值),立即调用clearerr(fp),使ferror(fp)值变0,以便再进行下一次检测只要出现文件读写错误标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数廊柯速舱楼行柿区禁忱计坟弗鸵愿奠蹄卓钵蛋欠丙可恬烧仓剩微鬼弟矣傻第10章文件的输入输出第10章文件的输入输出