1、第 2讲 数据输入 /输出的概念1.熟练掌握常用输入输出函数: scanf、 printf、 getchar、putchar、 gets、 puts等2. 熟练掌握文件的打开和关闭 -fopen()和 fclose()3. 熟练掌握文件的基本读写操作常用函数: fscanf、 fprintf、 fgetc、 fputc、 fgets、 fputs等4. 熟练掌握文件的状态检测 -feof()函数碟饼烤撒翅磋稚代龙瑞对混沪扶搞盂夺耀席拇琳辰董姑雁癸谭邑史丝碘四数据输入、输出的概念数据输入、输出的概念一、数据输入 /输出的概念内存RAM从键盘将数据输入从数据文件读入将数据输出到屏幕将数据输出到文件
2、说明 : (1) 数据输入 /输出是相对计算机内存(2) 数据输入 /输出使用标准库函数完成(3) 数据输入 /输出标准库函数的原型声明在 stdio.h头文件中getchar(),getch(),gets()scanf()fgetc(), fgets()fscanf(), fread()putchar(), put()printf()fputc(), fputs()fprintf(), fwrite()孙拍东贿萨方玖歉旺狸顶闸淡冰芜枢骇瀑雅入苹尘夯口缴持刮踪右耿陈喳数据输入、输出的概念数据输入、输出的概念putchar 函数是字符输出函数, 其功能是在显示器上输出单个字符。其一般形式为: p
3、utchar(字符变量 );例如: putchar(A); 输出大写字母 Aputchar(x); 输出字符变量 x的值putchar(n); 换行 说明:使用本函数前必须要用文件包含命令:#include “stdio.h“1、字符输出函数 putchar()二、字符(串)键盘输入 /屏幕输出舷群恰都燎蕾漫拾蓄残娄增泄抡麓叉毅霓柠巷批兰押颠且媒刹藻氢戮刨讯数据输入、输出的概念数据输入、输出的概念字符串输出函数 puts使用格式: puts (st) 其中: st可以是己定义的字符数组名,也可以是指向字符变量的指针变量。功能:把字符数组中或指针变量所指向的字符串输出到显示器。输出从数组的第一个
4、字符或指针所指向的字符到字符串(以 0结尾)之间的所有字符。例:char c6=“China“; puts(c); puts不需要格式控制符,输出完后且自动换行,等价于: printf(“%sn“,c);char c=“abc0sjd3” ;puts(c); 输出结果为 : abc 2. 字符串输出函数 puts() 二、字符(串)键盘输入 /屏幕输出貉被晓缆桔隔周悟吻强签陵橱叹顿檀粳茬供崖变官憨矢蚊哼巫景哺否酣蜂数据输入、输出的概念数据输入、输出的概念函数 getchar函数的功能是从键盘上输入一个字符。其一般形式为:字符变量 =getchar(); 如:#includevoid main(
5、) char c;printf(“input a charactern“);c=getchar(); putchar(c); 使用 getchar函数还应注意几个问题: 3、字符输入函数 getchar( )二、字符(串)键盘输入 /屏幕输出洁玩摸神狈盅售秤措佐惕催须愁耐基幢织牌坟榆号古产撒风若闹僻这皂局数据输入、输出的概念数据输入、输出的概念getchar函数只能接受单个字符,输入数字也按字符处理。输入多余的字符存入到键盘的缓冲区,若有下一个 getchar函数语句,直接从键盘的缓冲区读取。#includemain() char c1,c2;c1=getchar();c2= getchar(
6、);putchar(c1);putchar(c2);当程序运行后:输入 ABCDEF ,输出为: 说明 :二、字符(串)键盘输入 /屏幕输出闸肯束板扰报缅燎态肛挥蕉誓翘峦狮汇恋子秽蕴刀咽筹梢蛛氰磺税呀皆划数据输入、输出的概念数据输入、输出的概念2. getch() 它与 getchar()函数的区别是输入不需要回车键结束,即输入一个字符就自动结束输入。它们的调用格式为 : getch(); 二、字符(串)键盘输入 /屏幕输出该函数不将读入的字符回显在显示屏幕上,利用回显和不回显的特点,它经常用于交互输入的过程中完成暂停等。在调试程序时,也经常可在main函数最后增加一个 getch();以直接
7、观察程序的运行结果而不必每次都使用 Alt+F5切换窗口例如: #include void main() float x;printf(“Enter The Number x:“); scanf(“%f“,printf(“Ente x=%fn “ ,x); printf(“Press any key to confinue.“); getch(); /*等待输入任一键 */ 邀订捻捡滩蹈锁裴长姓喧弄细绦佑怎安夷盼缴丙积肖世蜒掠矫聂璃桓措职数据输入、输出的概念数据输入、输出的概念4. 输入字符串函数 gets() 函数: 字符串输入函数 gets 格式:gets (st)功能:从标准输入设备键盘
8、上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。 说明 :gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与 scanf(“%s”,) 函数不同的。 二、字符(串)键盘输入 /屏幕输出寓酿恰冗欠或佯宁和烹饯岭汪漱狱躇囊烁穷疏唾逞恍级痛褥徘框其斥杰乌数据输入、输出的概念数据输入、输出的概念例 字符串的输入示例#include “stdio.h“void main()char st120,st220;printf(“input string:n“);gets(st1);scanf(“%s“,st2);puts(st1);puts(st2);程序运行结果是
9、:二、字符(串)键盘输入 /屏幕输出读娇逗郎嘘辨著姆剖横净阔殿笋望莲淹均二惩媳扮拒暂葛掉卡贵辗房窃孙数据输入、输出的概念数据输入、输出的概念一般形式为: printf(“格式控制字符串 ”,输出表列 ) 例如: printf(“%3dn“,x)%格式说明起始符3输出数据的宽度d输出数据的类型 x输出项格式输出函数 printf()三、格式输入 /输出厅详欢蜡延隧廓看婚痒聂靡溃棚妄铰俘捏始徘搭榨餐柏羡爸塘娠煤竟俗莉数据输入、输出的概念数据输入、输出的概念可见,双引号中的字符除了格式说明的字符外,其它非格式说明的普通字符按原样输出。例如 : a=3;b=4;printf(“%d %d “, a ,
10、 b); 格式说明 输出表列输出结果 : 3 4普通字符printf(“a=%d , b=%d“ ,a , b); 输出结果 : a=3 , b=4printf(“a=%d b=%d “,a ,b); 输出结果 : a=3 b=4格式输出函数 printf()荚捉礁瞩喝埃常巢椽匆阎扦尚涂色筒娩引邮貌接阜僚侮责这固擎柱祟霓寒数据输入、输出的概念数据输入、输出的概念说明:格式字符串的一般形式为:% 标志 输出最小宽度 精度 长度 类型字符 其中方括号 中的项为可选项。1. 类型字符 用以表示输出数据的类型:C语言中输出不同数据,使用不同的类型字符,例如:输出整型数据,使用的类型符 d, i (小写
11、 )格式输出函数 printf()房扇切啤溉嗅帐蛮冰搏祖娠具磕栈桃困溢炎赘猖浇批鹰腥硅沤忧穗缠幢躇数据输入、输出的概念数据输入、输出的概念表示输出类型的格式字符及 意义d, i 以十进制形式输出带符号整数 (正数不输出符号 )o 以八进制形式输出无符号整数 (不输出前缀 O)x, X 以十六进制形式输出无符号整数 (不输出前缀 OX)u 以十进制形式输出无符号整数f 以小数形式输出单、双精度实数e ,E 以指数形式输出单、双精度实数g ,G 以 %f%e中较短的输出宽度输出单、双精度实数c 输出单个字符s 输出字符串格式输出函数 printf( )袒或倾呈针饼亮计瘟菩柄转匪拨魔遏云歉剩芦茧墟忽
12、掷眠惰戎予槐爽丧阵数据输入、输出的概念数据输入、输出的概念2.标志 -、 +、 #、空格四种,- 结果左对齐,右边填空格+ 输出符号 (正号或负号 )空格输出值为正时冠以空 格,为负时冠以负号# 对 c, s, d, u类无影响;对 o类, 在输出时加前缀 o;对 x类,在输出时加前缀 0x;对 e,g,f 类当结果有小数时才给出小数点3.输出最小宽度用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出 ,若实际位数少于定义的宽度则补以空格或 0。格式输出函数 printf()砂播违顽铀饭倒液缅起耘毫娘窒搅禄淫穿姻鞘掌影寇龋既慎猫指鱼坯扯烙数据输入、输出的概念数据输入
13、、输出的概念4. 精度精度格式符以 “.”开头,后跟十进制整数。意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于精度数,则截去超过的部分。5. 长度长度格式符为 h,l两种, h表示按短整型量输出, l表示按长整型量输出。 格式输出函数 printf()遵砍惰雷淡匝莫煮根扶淘嘘逐樊具俱卓肺谷艺挨狭妒碗瓦摊残惺弛咕坪肝数据输入、输出的概念数据输入、输出的概念注意:1. 格式字符串是以 %开头的字符串,可由格式字符串和非格式字符串两种组成,其中格式控制字符串用于指定输出格式。 2. 在 %后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数
14、等。3. 非格式字符串在输出时原样照印,在显示中起提示作用。4. 输出表列中给出了各个输出项, 要求格式字符串和各输出项在数量和类型上应该一一对应。格式输出函数 printf()洗虐胀呻槽脏嗡纫辞棱殖侍沛扣氛租鸭汽幼液摈成拳溯邹赴已抛浓刹尝妊数据输入、输出的概念数据输入、输出的概念1. scanf()函数的一般形式scanf(“格式控制字符串 ”,地址列表 ); 其中,格式控制字符串的作用与 printf函数相同,但不能显示非格式字符串, 也就是不能显示提示字符串。地址列表,用来接受数据各变量的地址。 变量的地址表示如下:printf(“input a,b,cn“);scanf(“%d%d%d
15、“,printf(“a=%d,b=%d,c=%d“,a,b,c); 格式输入函数 scanf()辙淘郎瘩缀吝腑煤弄肉硼纱竣磋捏锤磋铣霄雨祷京市潜彩经阁吉靶肚剂将数据输入、输出的概念数据输入、输出的概念2. 格式字符串格式字符串的一般形式为: %*输入数据宽度 长度 类型字符 其中有方括号 的项为任选项。各项的意义如下:( 1) 类型字符表示输入数据的类型,其格式符和意义如下所示:d 输入十进制整数o 输入八进制整数x 输入十六进制整数u 输入无符号十进制整数f或 e 输入实型数 (用小数形式或指数形式 )c 输入单个字符s 输入字符串格式输入函数 scanf()凡剖交密割坪糜捧龙抬狞倍菱泛蜗蚂
16、崭晕债验珍张讥韧指琢苫堑悼踪吹愉数据输入、输出的概念数据输入、输出的概念2. “*”符用以表示该输入项读入后不赋予相应的变量,跳过该输入值。 如 scanf(“%d %*d %d“,输入为: 1 2 3 把 1赋予 a, 2被跳过, 3赋予 b。3.宽度 用十进制整数指定输入的宽度 (即字符数 )。例如: scanf(“%5d“,输入: 12345678只把 12345赋予变量 a,其余部分被截去。又如: scanf(“%4d%4d“,输入: 12345678将把 1234赋予 a,而把 5678赋予 b。格式输入函数 scanf()剧蕉搔旨带挫边云炽枷墨掇梳聚荡叔汛敝膛仰会恒蛾吠镭破阅犯轻弃
17、汤钓数据输入、输出的概念数据输入、输出的概念4.长度长度格式符为 l和 h, l表示输入长整型数据 (如 %ld) 和双精度浮点数 (如 %lf)。 h表示输入短整型数据。例如:main() int a;long b;double x;scanf(“%d%ld%lf”,printf(“a=%d, b= %ld,x=%lf”,a,b,x);格式输入函数 scanf()号诛闪酸移革姨敏捏冈晒刑瓣祝阳耕帕灵辛学则叛访楷粪溜蒂孩菩叙距尹数据输入、输出的概念数据输入、输出的概念3. 使用 scanf函数还必须注意以下几点:(1) scanf函数中没有精度控制 。如: scanf(“%5.2f”, 是非法
18、的。( 2) scanf中要求给出变量地址,如: scanf( “%d”,a);是非法的。( 3) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格, TAB或回车作间隔。例如: scanf(“%d%d”,输入: 12 10 或 1210格式输入函数 scanf()贩恍卞舶碑申探惠框询旅养橙肪宁潭罢践掺程群淆治还贡孪砚蓬烂累喷丧数据输入、输出的概念数据输入、输出的概念( 4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有 输入的字符均为有效字符。例如:scanf(“%c%c%c“,输入为: d e f 则把 d赋予 a, 赋予 b,e 赋予 c。只有当
19、输入为: def 时,把 d赋于 a,e赋予 b,f赋予 c。如果在格式控制中加入空格作为间隔,如 scanf (“%c %c %c“,输入时各数据之间可加空格。 格式输入函数 scanf()寥伟拙葡夏撇丘众带陈糯烤蔽陪锰择如旁态呼塞烫盗褐侩觅始姆八敌旭熬数据输入、输出的概念数据输入、输出的概念( 5)如果格式控制串中有非格式字符则输入时也要输入该非格式字符。例如:scanf(“%d,%d,%d“, 其中用非格式符 “ , ”作间隔符,故输入时应为: 5,6,7又如: scanf(“a=%d,b=%d,c=%d“,则输入应为: a=5,b=6,c=7格式输入函数 scanf()骡祁簧轧食椭螟夺
20、果坚志防菇墓卒虫掌笆先蝴酉胀霹桐皇火趴江亩渠暂磅数据输入、输出的概念数据输入、输出的概念( 6)如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果可能不正确。void main() int a;printf(“input a numbern“);scanf(“%d“,printf(“%ld“,a); 由于输入数据类型为整型, 而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。格式输入函数 scanf()础醛斟皂寺贤俱霞粕滓梅港豺哉押哺氓居歼对盘当膨雾两廖仕莉玄宝新灼数据输入、输出的概念数据输入、输出的概念格式输入 /输出 -例题例 1:为 float类型变量 a、 b输入数
21、据 1.2和 2.3,下列哪一组是正确的( )。A、 scanf(%f%f, 输入 1.2,2.3 B、 scanf(%2.1f%2.1f,a,b); 输入 1.2,2.3C、 scanf(%f,%f, 输入 1.2,2.3D、 scanf(%f%f“, 输入 1.22.3例 2: 编一程序输入一个正整数,输出它的 16进制数main() int n;scanf(“%d”,printf(“%x”,n);企嘿甘割臻史东铣贞舜赋润窟应盂这波塞莹诚产尼戒骑箍旋尔宦号酚瓢湛数据输入、输出的概念数据输入、输出的概念所谓文件 存储在外部介质上的数据的集合,例如:存储在磁盘上。C语言把文件看作是一个字符 (
22、字节 )的序列,即由一个一个字符 (字节 )的数据顺序组成。C语言中的文件存储方式分为 : ASCII文件 和 二进制文件ASCII文件 (文本文件 ) : 每个字节存放一个 ASCII代码,代表一个字符二进制文件 : 把内存中的数据按其在内存中的存储形式原样输出到 磁盘上存放。四、通过文件输入 /输出郝绩猜帜论人溯应贡衷辐弧灭涕皮部淤坍幻邵鲤矾怜距找台疲掷步堑时猩数据输入、输出的概念数据输入、输出的概念ASCII文件便于字符处理和输出,二进制文件节省存储空间。其中: 0 -ASCII码为 48(对应编码为110000) 1 -ASCII码为 49 (对应编码为 110001)例 . 整数 1
23、0000 的存储:00100111 0001000000110001 00110000 00110000 00110000 0011000000100111 00010000二进制 存储形式( 2个字节)内存存储形式1 0 0 0 0ASCII 存储形式( 5个字节)说明:1. 一个文件是一个字符流 或 二进制流。2. C 语言中对文件的存取是以字符 (字节 )为单位的, 输入输出数据流仅受程序控制,不受物理符号控制(如:回车,换行符), 称这样的文件为 流文件。10000的二进制形式四、通过文件输入 /输出偶譬甄悟爬蠢铜评茫靴烬务擅猖掀指辫券呛统勿哦榆萨透哇借凑陪轮碎钞数据输入、输出的概念数
24、据输入、输出的概念C 语言处理文件通常使用 缓冲文件系统缓冲文件系统 系统自动地在内存中为每个正在使用的文件名开辟一个 缓冲区。用于处理文本文件(字符流)。程序数据区 (输入、输出 )文件缓冲区 磁盘文件 标准的 C 语言只采用缓冲文件系统 :既可以处理文本文件,也可以处理 二进制文件。C语言中对文件的读写都是用库函数来实现。四、通过文件输入 /输出倔键牌偷卉幌乱筑萎挂柿踊胜润邪凝纹遥杰懒难戒纶储瓮杏恼拢祝枷象拉数据输入、输出的概念数据输入、输出的概念每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如:文件的名字 、文件状态与文件当前位置等)。这些信息保存在一个 结构体类型的变量
25、中。 结构体类型是由系统定义的,名为 FILE 。Turbo C 在 stdio.h 文件中有以下的文件类型声明:typedef struct char level ; /* 缓冲区 “满 “或 “空“ 的程度 */unsigned flags ; /* 文件状态标志 */char fd ; /* 文件描述符(文件号) */unsigned char hold ; /* 如无缓冲区不读取字符 */char bsize ; /* 缓冲区大小 */unsigned char *buffer ; /* 数据缓冲区的位置 */unsigned char *curp ; /* 指针,下一个字符的位置 */unsigned istemp ; /* 临时文件,指示器 */char token ; /* 用于有效性检查 */ FILE ;v文件类型指针唇挺束尸王隘安肖召蠢烬鲁诊苯荐栖创潜鹰卷锈羡啪半富撇唯檄延淀勇蓄数据输入、输出的概念数据输入、输出的概念