第四讲输入输出_第1页
第四讲输入输出_第2页
第四讲输入输出_第3页
第四讲输入输出_第4页
第四讲输入输出_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/2/51第四讲C语言的输入输出与格式控制裘宗燕书第三章3.7节和第八章8.3节文件(File)是计算机的基本处理对象计算机具有强大的文件处理能力制作、储存、加密、传输、归档、显示、压缩、…处理的文件类型多种多样纯文本文件,以txt为扩展名可执行文件,以exe为扩展名Word文档文件,以.doc/docx为扩展名演示稿文件,以.ppt为扩展名便携式文档格式文件,以.pdf为扩展名问题文件保存在什么地方?我们的程序能否处理文件?我们程序如何才能处理文件?有没有一些所谓的标准文件?22023/2/5PDF文件列表32023/2/51.标准输入输出文件标准输入/输出文件是C程序中默认的基本文件,这两个文件在程序开始运行时被自动打开,在程序结束时被自动关闭。默认情况下,标准输入文件对应于键盘,标准输出文件对应于显示器。在C程序中,标准输入文件(stdin)与任何其他输入文件一样,是一个可以从中按顺序连续读出字节流的数据来源。标准输出文件(stdout)也与其他输出文件一样,是一个可以向其按顺序连续写入字节流的数据容器。标准输入与输出文件示意42023/2/5键盘:以文件的形式给电脑看,提供输入。电脑可以看的纸。显示器:被电脑当成书写和展示设备,在程序中以文件的形式出现。电脑可以写的纸人写电脑看电脑写人看52023/2/52.字符输入输出函数字符IO函数getchar和putchargetchar是无参函数从标准输入读一个字符,返回字符的编码值。intgetchar(void)//注意返回值类似是int型。intgetc(stdin)典型使用(输入的字符赋给变量c):c=getchar();标准输入默认是键盘。没有输入数据时getchar等待,直到用户输入字符并换行。62023/2/5putchar函数原型:intputchar(intc)函数调用例子putchar('O');putchar('K');功能:把一个字符送到标准输出(stdout)相当于:intputc(intc,stdout)#include<stdio.h>intmain(){intc;c=getchar();putchar(c);putchar('\n');return0;}72023/2/5总结正常情况下getchar返回读入的字符,遇文件结束返回EOF(一个常量)值。应该用int变量接收getchar的返回值,以保证正确判断输入结束。如果用char变量,值超出char范围时结果无定义。charch;while((ch=getchar())!=EOF)...intch82023/2/5例,统计文件中字符个数统计(由标准输入得到的)文件中的字符个数。intCountInput(){intc;longn=0;while((c=getchar())!=EOF)n++;returnn;}标准输入默认为键盘。程序执行到getchar等待输入,得到输入后处理。用Ctrl-Z发信息可使循环结束。问题:能从普通文件中读取数据吗?92023/2/5从普通文件中读入设以上源程序是count.c,编译结果是count.exe。用命令行方式启动该程序,将标准输入定向到文件(设被统计文件是abcd.txt):count<abcd.txt读入循环中可以完成对输入内容的各种处理,例如:统计某个字符出现的次数,统计文件中的行数等等操作系统OS允许标准输入重新定向。将标准输入定向到文件可使文件成为getchar或scanf的输入源。程序里不必区分实际输入来自键盘还是实际文件。处理连续输入时,这两者没有本质差别。102023/2/5重定向标准输出文件输出数据重定向标准输入文件输入数据重定向变换输入数据来源或输出数据的去向,是操作系统命令行的功能。操作系统中常见的输入输出重定向方法输入重定向语法命令行及参数<

输入来源文件名设有可执行文件count.exe,在控制台命令窗口输入命令:count//默认输入为stdin,即键盘count<abc.txt//输入重定向为abc.txt输出重定向语法命令行及参数>

输出去向文件名设有可执行文件count.exe,在控制台命令窗口输入命令:count//默认输入为stdout,即字符显示器count>a.txt//输入重定向为a.txt2023/2/511输出重定向例子122023/2/5如程序名称:hello.cpp,生成可执行文件hello.exe#include"stdio.h"intmain(intargc,char*argv[]){ printf("HelloWorld!\n"); return0;}在命令行(cmd)运行:hello>a.txt,把输出打印到a.txt文件。132023/2/53.标准I/O的行式输入输出对标准输入/输出流也有行式I/O函数,原型:char*gets(char*s)intputs(constchar*s)gets读一行到s,用'\0'代行尾'\n'并返回s。s应是字符数组。出错或遇文件结束返回NULLputs将字符串s以及一个换行符输出。正常完成返回非负值,出错返回EOF用gets时应注意数组越界(无法限制写入长度),应选用足够大的数组142023/2/5一般用法一般使用形式:chars[256];...if(gets(s)!=NULL)......if(puts(s)!=EOF)...应检查和处理操作未正常完成的情况。gets函数无长度控制,成为许多系统的安全漏洞。建议用fgets(buf,len,stdin)或者scanf(格式串里写%ns,其中的n为长度限制)代替gets152023/2/54.scanfscanf从标准输入(stdin)读数据,根据格式描述将实际输入转换到指定类型,转换结果赋给指定变量:scanf(格式描述串,&变量名,...)格式描述串与printf的类似,其中的转换描述(以%开头)说明输入形式和转换方式。其他参数(个数应与格式串中转换描述一致)指明接受输入的程序变量。形式是在变量名前面加&符号。注意必须写&符号,不写将引起严重问题为什么?162023/2/5输入格式控制scanf的原型:intscanf(constchar*format,...);相当于intfscanf(stdin,constchar*format,...);scanf将输入流看成空白字符分隔的字段,读入过程就是对这些字段的顺序处理format指挥scanf进行转换,成功转换得到的值赋给对应变量(地址来自参数)scanf处理完格式串或遇转换失败时结束,返回所完成的转换项数172023/2/5format里各种字符的意义空白字符(空格/制表符)要求scanf跳过输入中遇到的空白字符(空格、换行符、制表符)普通字符非转换描述的非空白字符。要求scanf将它与输入流下一个非空白字符匹配,字符相同时匹配成功,否则转换失败转换描述一个转换描述刻画对流中下一字段的转换方式。以字符%开始,到转换字符结束182023/2/5转换描述转换描述,%之后可以有*表示只匹配不赋值;长度描述(整数)指定输入字符个数;最后是转换字符如d,f,x等,前面可加目标长度限制如l,h等。转换顺利完成时结果赋给参数所指变量(无*时)。若有长度描述就以指定个数的字符为字段。有星号(如%*s、%*6d等)时所匹配的东西不赋值,直接丢掉。192023/2/5简单示例#include<stdio.h>intmain(){inti,n=0;

printf("Pleaseinputanumber:");scanf("%d",&n);printf("%d%d\n",n,n*n);return0;}从用户在键盘输入的字符流的当前位置之后尝试读一个十进数给出n的地址,告诉scanf函数,将读到数据看成是十进制数,转换后放入给定地址:&n202023/2/5转换字符的意义转换字符的意义,所要求实际输入,对应参数类型:d十进制形式的整数。 (int*)i 整数,可为十、八或十六进制表示。 (int*)o八进制整数,可无先导字符0。 (int*)u无符号十进制整数。(unsigned*)x十六进制整数,可无先导0x或0X。 (int*)c字符,指定输入宽度可输入多字符到字符数组。不跳过空白,读入多字符后不加‘\0’。(char*)s 非空白字符序列,可有长度限制。在字符数组最后附加‘\0’(做成字符串)。 (char*)212023/2/5转换字符的含义转换字符的含义e,f,g符合C语言规定形式的浮点数。(float*)p指针值,形式与printf(“%p”)输出一致。用于把由printf输出的指针值读回。 (void*)n向对应参数中写入本次函数调用执行到此已读的字符个数。不实际读入也不计转换项数。(int*)[...]与所列字符的最长序列匹配,写入数组并附‘\0’。用[]...]表示匹配串可含‘]’。 (char*)[^...]与不含所列字符的最长序列匹配,写入数组并附‘\0’。[^]...]表示不含‘]’。(char*)%与输入流中的字符%匹配,不赋值。222023/2/5转换字符说明转换字符d、i、o、u、x前面可以标明目标长度,h表示赋值目标为short;l表示赋值目标为long转换字符e、f、g前加l表示目标是double,L表示是longdouble加了这些字符,scanf将按指定类型构造和赋值未做转换前出错或者遇到文件结束时返回EOF其他情况下返回执行中完成转换的项数,返回0表示第一个转换失败232023/2/5例scanf(“%ld”,&a)的处理过程scanf读入并丢掉空白符号(可无),然后做匹配;若遇到的非空白字符不能看作数,则匹配失败;否则就逐个读入字符,直至遇到第一个非数字字符;将读入的正负号及数字字符序列做成一个长整数,赋给指定的变量;多个转换描述的处理类似如果转换失败,引起失败的字符仍在流中,下次调用输入函数将先读到这个字符242023/2/5注意事项输入的数据之间一般只能有空白字符格式串里一般不写转换描述之外的东西。如果写"%d,%lf,%f"就是要求用逗号分隔输入数据,若输入时不注意就会导致数据不能正常读入。建议不要这样写。scanf格式串的细节参看第四章及给大家发的资料。252023/2/5缓冲式输入程序要求从标准输入取得信息(如执行scanf)时,若由键盘输入,在按Enter键后程序才能得到输入数据。造成这种情况的原因是操作系统通常采用“缓冲式”输入方式,把来自键盘的输入临时保存在“输入缓冲区”(操作系统管理下的一块内存区域)里。直至人按了Enter键,才把缓冲区里的数据送给程序,这时scanf等输入函数才能读到数据。262023/2/5深入理解scanfscanf的返回值是int,它顺序处理格式串根据格式串要求完成输入、转换和对变量的赋值工作正常结束时返回所完成的数据转换项数如果一开始就遇到文件结束,就返回一个特殊符号常量EOF(是一个int值,后面再介绍)如果没处理完整个格式串就失败时,返回已完成的数据转换项数scanf用输入数据与正在处理的转换描述比较,如果相符就完成一项转换。例如:若转换描述是%d,输入得到的是一串数字,就把它们转换为一个整数如果实际输入与转换描述不匹配,转换失败自学272023/2/5关于scanfscanf要求三方面一致格式串中转换描述、对应参数的类型、运行中提供的数据形式。假如格式串要求做整数转换,赋给整型变量。若实际输入不是一串数字,scanf也无法正常完成工作在格式串要求读整数或者浮点数,scanf会跳过遇到的空白字符,从下一非空白字符开始处理自学282023/2/5scanf的返回值下面函数调用可能产生三种返回值:scanf("%lf",&x)返回1表示成功读入一项数据,并存入了x返回0表示读入数据失败返回EOF值表示遇到文件结束应该通过这种性质控制循环例:读入一些圆盘半径,算出各圆盘的面积并输出。不知圆盘数,可利用scanf的返回值控制循环结束自学292023/2/5如何输入一批数据通过一个循环处理,在循环中反复调用输入函数,分两种情况如果事先知道需要输入数据的项数,就可以用计数器控制输入循环。否则就需要用特殊标志或方法结束循环用一个特殊数据作为最后一个数的标志用EOF(endoffile)结束输入每输入一个数后让用户确认是否还有新数302023/2/5程序#include<stdio.h>voidpc_area(doubler){/*定义略*/}intmain(){doublex;while(scanf("%lf",&x)==1){if(x<0)printf("Inputerror:%f\n",x);elsepc_area(x);}return0;}/*什么情况下循环结束?*/确保能正确地读入一个数,不会异常终止自学312023/2/5文件结束符EOF遇到文件结束或错误数据时scanf不返回1。如果上面程序遇到输入字母m,转换失败就会导致循环结束。更好的方式是利用标准库定义的符号常量EOF。如果把标准输入定向到某个文件,在读完文件里所有数据后scanf就会返回EOF值。在标准输入中,组合键:CTRL+Z或者Ctrl-D表示EOF值。322023/2/5EOF是什么一般的C系统把EOF定义为-1,它一定不是正数,不会与scanf的其他返回值混淆。默认情况下,标准输入从键盘得到数据。许多系统里可以用Ctrl-Z或Ctrl-D组合键送入文件结束信息。前面程序运行时,如果按了这种组合键,scanf就会返回EOF并导致循环结束。332023/2/5例统计一批输入数据的个数和最小值/最大值/平均值解决方法循环读入数据,并完成其他工作。两个变量记录已知的最小、最大值。读数据中考虑更新,使其保存已读数据的最小最大值(循环不变性质)。两个变量记录数据个数,记录已读入数据之和。循环中要正确更新(循环不变性质)。342023/2/5问题保存最大值和最小值的变量的初始值?解决办法假定最少有一个输入数据用读入的第一个数据作为最大和最小变量的初始值。352023/2/5#include<stdio.h>intmain(){doublesum=0.0,biggest,smallest,x;intcount=1;scanf("%lf",&sum);

biggest=smallest=sum;while(scanf("%lf",&x)==1){sum+=x;count++;if(x>biggest)biggest=x;if(x<smallest)smallest=x;}

…/*输出结果,略*/return0;} /*要求至少有一个输入数据*/362023/2/55.输出格式控制以printf为例(其他格式化输出函数同)原型:intprintf(constchar*format,...);功能format里的非转换描述直接输出根据转换描述顺序转换各实参,结果插入在format里相应位置,形成整个输出出错时返回负值正常完成返回实际输出的字符个数372023/2/5转换描述转换描述从%开始到转换字符止,中间可有若干字符,顺序地可以有如下成分(都可缺):1)标志字符:下面字符可以以任意顺序出现:-转换结果在字段范围内左对齐+数值前面总输出正负号 空格,转换得到的首字符不是正负号时输出一个空格0若数值输出不能填满字段,前面全填0#指定另一种形式。对转换符o的数值前加0;x和X的非0结果前加0x或0X;e、E、f、g、G输出时总写小数点;g和G,不去掉最后的0。382023/2/5说明2)最小字段宽度(整数)。转换结果至少占这么宽,可更宽。若得到的序列不够,在左边(或右边,有+时)填空格。数值在有0标志时在数字序列左边填0。3)圆点及另一数。对字符串参数表示最大输出字符数;对e、E、f表示小数点后数位;对g、G表示有效数位;对整数表示最小输出数字个数,不够时左边添0。4)目标长度字符h、l或L。h和l用于整参数,h指short或unsignedshort;l指long或unsignedlong。L指longdouble。字段宽度/精度可写*,表示值由参数取得。提供值的参数必须是int。392023/2/5转换字符转换字符,所要求参数类型和实际输出形式:d,i带符号的十进制形式整数(int)o无符号八进制表示的整数,无先导0(int)x,X无符号十六进制整数,无先导0x或0X。用x时十以上数字用abcdef;对X用ABCDEF(int)u无符号十进制整数(int)c 字符,转为unsignedchar输出(int)s 字符序列,从参数所指位置直到字符‘\0’,或者达到字段的指定宽度为止(char*)f 一般实数形式[-]mmm.ddd,小数点后位数由精度描述定,默认6。精度为0不输出小数点(double)402023/2/5转换字符e,E 科学记数法[-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论