




已阅读5页,还剩121页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
流与标准库输入输出缓冲基于控制台的I/O基于文件的I/O基于字符串的I/O,第14章输入输出与文件,流的概念及用途,输入输出是指程序与外部设备交换信息I/O操作是以对数据类型敏感的方式执行的。C+的I/O操作是以字节流的形式实现的。流实际上就是字节序列。C+提供了高级I/O功能。高级I/O功能把若干个字节组合成有意义的单位,如整数、浮点数、字符、字符串以及用户自定义类型的数据。,C+提供了无格式I/O和格式化I/O两种操作。无格式I/O传输速度快,但使用起来较为麻烦。格式化I/O按不同的类型对数据进行处理,但需要增加额外的处理时间,不适于处理大容量的数据传输。在C+中,输入输出不是语言所定义的部分,而是由标准库提供。C+的输入输出分为:基于控制台的I/O基于文件的I/O基于字符串的I/O,流与标准库:面向对象的输入输出是通过C+的输入/输出类库来实现的,类的继承关系,流与标准库输入输出缓冲基于控制台的I/O基于文件的I/O基于字符串的I/O,第14章输入输出与文件,输入输出缓冲,C+的输入输出是基于缓冲实现的每个I/O对象管理一个缓冲区,用于存储程序读写的数据。当用cout和插入运算符“”从输入缓冲区中提取数据送给程序中的有关变量。总之,流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。,流与标准库输入输出缓冲基于控制台的I/O基于文件的I/O基于字符串的I/O,第14章输入输出与文件,基于控制台的I/O,基于控制台的输入/输出的支持主要包含在两个头文件中:和头文件声明了所有I/O操作所需要的基础服务,定义了4个标准的输入输出流对象cin是类istream的对象,它与标准输入设备(常指键盘)连在一起。cout是类ostream的对象,它与标准输出设备(常指显示设备)连在一起。cerr是类osteam的对象,它与标准错误输出设备连在一起。clog是类ostream的对象,它与标准错误输出设备连在一起。,cerr流对象:类osteam的对象,与标准错误输出设备连在一起。cerr的作用是向控制台(显示器)显示出错信息。对象cerr的输出是非缓冲输出,也就是说插入到cerr中的输出会被立即显示出来,非缓冲输出可迅速把出错信息告诉用户。cerr与标准输出流cout:作用和用法差不多。但有一点不同:cout流可传送到显示器输出,也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。当调试程序时,往往不希望程序运行时的出错信息被送到其他文件,而要求在显示器上及时输出,这时应该用cerr。clog流对象:类ostream的对象,与标准错误输出设备连在一起。对象clog的输出是缓冲输出。即每次插入clog可能使其输出保持在缓冲区,要等缓冲区刷新时才输出。,基于控制台的I/O,输出流输入流格式化输入/输出,输出流(ostream),C+的类ostream提供了格式化输出和无格式输出的功能输出功能包括用流插入运算符()输出标准类型的数据;用成员函数put输出字符;成员函数write的无格式化输出;,1.输出标准类型的数据,标准类型的数据用流插入运算符输出格式:cout数据项;C+能自动判别数据类型,并根据数据类型解释内存单元的信息,把它转换成字符显示在显示器上。,输出流,#includeusingnamespacestd;intmain()inta=5,*p=,a=5x=1234.56ch=a*p=5p=0012FF7C*pch=apch=ab,地址的默认输出方式:十六进制,如果输出的指针变量是一个指向字符的指针,C+并不输出该指针中保存的地址,而是输出该指针指向的字符串,指针输出的特例,如果输出的指针变量是一个指向字符的指针时,C+并不输出该指针中保存的地址,而是输出该指针指向的字符串。如果确实想输出这个指向字符的指针变量中保存的地址值,可以用强制类型转换,将它转换成void*类型,#includeusingnamespacestd;intmain()char*ptr=abcdef;coutptr指向的内容为:ptrendl;coutptr中保存的地址为:(void*)ptrendl;return0;,ptr指向的内容为:abcdefptr中保存的地址为:0046C04C,2.用成员函数put输出字符,cout.put(A);将字符A显示在屏幕上。,cout.put(A).put(n);连续调用put函数,在输出字符A后输出一个换行符。圆点运算符(.)从左向右结合,put成员函数返回调用put的对象的引用。,cout.put(65);用ASCII码值表达式调用put函数,语句也输出字符A。,3.成员函数write的无格式输出,调用成员函数write可实现无格式输出。它有两个参数。第一个参数是一个指向字符的指针,第二个参数是一个整型值。这个函数把一定量的字节从字符数组中输出。这些字节都是未经任何格式化的,仅仅是以原始数据形式输出。例如:charbuffer=“HAPPYBIRTHDAY”;cout.write(buffer,10);输出buffer的10个字节函数调用:cout.write(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,10);显示了字母表中的前10个字母。,基于控制台的I/O,输出流()输入标准类型的数据;用成员函数get和getline输入字符;成员函数read的无格式输入;,1.流提取运算符,流的输入最常用的是流提取运算符。流提取运算符通常会跳过输人流中的空格、tab键、换行符等空白字符。当遇到输入流中的文件结束符(eof/CtrlZ)时,流提取运算符返回0(false);否则,流提取运算符返回对调用该运算符的对象的引用。,可以利用这个特性来控制输入的循环,实例,统计某次考试的最高成绩。假定事先不知道有多少个考试成绩。(while循环实现),解决方法一:选择一个特殊的输入标记(-1)表示输入结束,intmain()intvalue,total,max,min,noOfInput;total=0;max=0;min=100;noOfInput=0;coutvalue;while(value!=-1)+noOfInput;total+=value;if(valuemax)max=value;if(valuevalue;return0;,解决方法二:利用流提取运算符的返回值,避免输入标记选择的问题。即用户可以输入表示成绩输入结束的文件结束符,程序将输出这批成绩中的最高分。,#includeusingnamespacestd;intmain()intgrade,highestGrade=-1;coutgrade)if(gradehighestGrade)highestGrade=grade;coutEntergrade(enterend-of-filetoend):;coutnnHighestgradeis:highestGradegrade)将变为0(即false)。,输出结果:Entergrade(enterend-of-filetoend):67Entergrade(enterend-of-filetoend):87Entergrade(enterendoffiletoend):73Entergrade(enterend-of-filetoend):95Entergrade(enterend-of-filetoend):34Entergrade(enterend-of-filetoend):99Entergrade(enterend-of-filetoend):zHeighestgradeis:99,2.1成员函数get,get函数用于读入字符或字符串get函数有三种格式:不带参数带一个参数带三个参数,不带参数的get函数,不带参数的get函数从当前对象读入一个字符,包括空白字符以及表示文件结束的EOF,并将读入值作为函数的返回值返回。如下列语句while(ch=cin.get()!=EOF)coutch1;则字符变量ch1中保存的是“.”。,#includeusingnamespacestd;intmain()constintSIZE=80;charbuffer1SIZE,buffer2SIZE;coutbuffer1;coutnThestringreadwithcinwas:nbuffer1n;cin.get(buffer2,SIZE);coutThestringreadwithcin.getwas:nbuffer2endl;return0;,Contrasting,(空格)stringinputwithcinandcin.get,2.2成员函数getline,与带三个参数的get函数类似,getline函数也带3个参数(字符数组、数组规模和结束符),它读取一行信息到字符数组中,然后插入一个空字符。不同的是,getline要去除输入流中的结束符(即读取字符并删除它,默认值是n),但是不把它存放在字符数组中。,#includeusingnamespacestd;intmain()constSIZE=80;charbufferSIZE;coutEnterasentence:n;cin.getline(buffer,SIZE);coutThesentenceenteredis:nbufferendl;return0;,输出:Usingthegetlinememberfunction.,输入:Usingthegetlinememberfunction.,#includeusingnamespacestd;intmain()constSIZE=80;charbufferSIZE;coutEnterasentence:n;cin.getline(buffer,SIZE,.);coutThesentenceenteredis:nbufferendl;return0;,输入:Usingthegetlinememberfunction.,Usingthegetlinememberfunction,intmain()constSIZE=80;charbufferSIZE,ch;coutEnterasentence:n;cin.getline(buffer,SIZE,.);cin.get(ch);coutbufferchendl;return0;,intmain()constSIZE=80;charbufferSIZE,ch;coutEnterasentence:n;cin.get(buffer,SIZE,.);cin.get(ch);coutbufferchendl;return0;,输出:IamstudentH,输出:Iamstudent.,三个参数的get函数和getline函数的区别输入:Iamstudent.Heisateacher.,对结束标记符的处理不一样。Get()之后,保留在缓冲区;Getline()之后不保留,对结束标记符的处理不一样。get()之后,保留在缓冲区;getline()之后不保留,3.read函数的无格式输入与gcount函数,调用成员函数read(char*,int)可实现无格式输入。它有两个参数。第一个参数是一个指向字符的指针,第二个参数是一个整型值。这个函数把一定量的字节从输入缓冲区读入字符数组,不管这些字节包含的是什么内容。例如:charbuffer80;cin.read(buffer,10);读入10个字节,放入buffer如果还没有读到指定的字符数,遇到了EOF,则读操作结结束。此时可以用成员函数gcount统计输入的字符个数,使用成员函数write,read,gcount进行无格式输入输出举例,intmain()charbuffer80;coutEnterasentence:n;cin.read(buffer,20);coutnThesentenceenteredwas:n;cout.write(buffer,cin.gcount();coutendl;cout一共输入了cin.gcount()octn;coutoctaloctninhexadecimalis:hexnn;couthexadecimalnindecimalis:decnn;coutsetbase(8)octalninoctalis:n0;-i)cout.precision(i);cout0;-i)/coutsetprecision(i)xty0;-i)cout.precision(i);coutfixedxtyendl;return0;,123.4567890009876.543210000123.456789009876.54321000123.45678909876.5432100123.4567899876.543210123.456799876.54321123.45689876.5432123.4579876.543123.469876.54123.59876.5,以定点小数形式输出浮点数,三、设置域宽与内容填充,域宽是指数据所占的字符个数。设置域宽可以用基类的成员函数width(),也可以用流操纵符(setw())。width和setw都包含一个整型的参数,表示域宽。设置域宽可用于输入,也可用于输出。设置宽度是适合于下一次输入或输出,之后的操作的宽度将被设置为默认值。(非粘性设置),当没有设置输出宽度时,C+按实际长度输出。如整型变量a=123,b=456,则输出coutab;将输出123456。一旦设置了域宽,该输出必须占满域宽。如果输出值的宽度比域宽小,则插入填充字符填充。默认的填充字符是空格。如果实际宽度大于指定的域宽,则按实际宽度输出。如语句coutsetw(5)asetw(5)bsetw(5)asetw(5)b;用户在键盘上的响应为abcdefghijklm则字符串a的值为“abcd”,字符串b的值为“efgh”。,用户的响应为:abcdefgh呢?,#includeusingnamespacestd;intmain()intwidthValue=4;charsentence10;coutsentence)cout.width(widthValue+);coutsentenceendl;cin.width(5);return0;,输入:Thisisatestofthewidthmember,Thisisatestofthewidthmember,空格是默认的填充字符,右对齐是默认的对齐方式。可以改变,内容填充(fill,setfill),用成员函数fill或操纵符setfill指定对齐域的填充字符:a=123,b=456coutsetw(5)asetw(5)bendl;cout.fill(*);coutsetw(5)aendl;coutsetw(5)bendl;,123456,*123*456,对齐(left,right,internal),流操纵符left使域左对齐,右边填充字符流操纵符right使域右对齐,左边填充字符流操纵符internal表示数字的符号(如使用showbase流操纵符显示的基数)应当左对齐,同时数值部分应右对齐,而中间部分使用填充字符,对齐实例#include#includeusingnamespacestd;intmain()intx=12345;coutsetw(10)xendl;/默认的是右对齐coutleftsetw(10)xendl;/左对齐coutrightsetw(10)xendl;/右对齐coutinternalsetw(10)xendl;coutshowposinternalsetw(10)xx;从文件中读取数据,利用该对象打开文件时会与文件相关联,打开文件,先定义一个流对象,然后该对象通过调用成员函数open打开文件ifstreaminfile;/定义对象infile.open(“file1”);/调用成员函数或infile.open(“file1”,ifstream:in);用流对象的构造函数打开文件ifstreaminfile(“file1”);或ifstreaminfile(“file1”,ifstream:in);,文件名以参数形式传入,创建对象时传入文件名,打开文件,无论是成员函数open还是通过构造函数打开文件,都有两个参数:打开的文件名(file1)文件打开模式(ifstream:in),打开文件做读操作,文件打开模式,默认打开方式,ifstream流对象是以in模式打开ofstream流关联的文件则以out模式打开fstream对象以in和out方式打开,打开输入文件:(读文件)ifstreaminfile;infile.open(“file1”);或infile.open(“file1”,ifstream:in);也可以利用构造函数直接打开:ifstreaminfile(“file1”);或ifstreaminfile(“file1”,ifstream:in);打开输出文件:(写文件)ofstreamoutfile;outfile.open(“file2”);或outfile.open(“file2”,ofstream:out);也可以利用构造函数直接打开:ofstreamoutfile(“file2”);或ofstreamoutfile(“file2”,ofstream:out);打开输入输出文件(读写皆可)fstreamiofile(“file3”);fstreamiofile(“file3”,fstream:in|fstream:out);,文件打开,文件关闭,用成员函数closeinfile.close();main函数执行结束时,会关闭所有打开的文件良好的程序设计习惯:文件访问结束时,关闭文件。尤其在一些大型程序中,一旦一个程序模块中没有关闭文件,在另一个模块中,就无法打开这个文件,关闭文件。三个文件流类各有一个关闭文件的成员函数voidifstream:close();voidofstream:close();voidfstream:close();使用很方便,如:iofile.close();关闭文件时,系统把该文件相关联的文件缓冲区中的数据写到文件中,保证文件的完整,收回与该文件相关的内存空间,可供再分配,把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。如又要对文件操作必须重新打开。关闭文件并没有取消文件流对象,该文件流对象又可与其他磁盘文件建立联系。文件流对象在程序结束时,或它的生命期结束时,由析构函数撤消。它同时释放内部分配的预留缓冲区。,基于文件的I/O,文件的概念文件和流文件的顺序访问文件的随机访问访问有记录概念的文件,文件的顺序访问,C+文件的读写和控制台读写一样,可以用流提取运算符“”从文件读数据,也可以用流插入运算符”操作成功时,返回true,否则返回false。,文件访问实例,将数字1到10写入文件file,然后从file中读取这些数据,把它们显示在屏幕上。首先用输出方式打开文件file。如文件file不存在,则自动创建一个,否则打开磁盘上的文件,并清空。用一个循环依次将1到10用流插入符插入文件,并关闭文件。用输入方式打开文件file,读出所有数据,并输出到屏幕上,最后关闭文件。,#include#includeusingnamespacestd;intmain()inti;/循环计数/定义输出文件流对象,并与file相关联ofstreamout(file);if(!out)/如果打开不成功,就返回cerri)couti;in.close();/关闭文件return0;,输出一个空格,为文件的读入做准备,因为提取运算符读数据时以空白字符分隔,执行该程序后,文件file中的内容为12345678910该程序的输出结果是12345678910,包含各种类型数据的文件操作除了数字,文件也可以输入字符串,同时有数字和字符串,#include#includeusingnamespacestd;intmain()ofstreamfout(test);if(!fout)cerrcannotopenoutputfilen;return1;fout10123.456“xs;coutix“ix;fin.getline(s,80,n);,文件中的内容为10123.456Thisisatextfile,读取顺序访问文件中的数据,读取文件(三种方式)方式1:ifstreaminClientFile(“clients.dat”,ios:in);方式2:ifstreaminClientFile(“clients.dat”);方式3:ifstreaminClientFile;inClientFile.open(“clients.dat”,ios:in);,例1:从一个文件读取数据并显示在显示器上,clients.dat100Jones24.98200Doe345.67300White0.00400Stone-42.16500Rich224.62,输出结果:AccountNameBalance100Jones24.98200Doe345.67300White0.00400Stone-42.16500Rich224.62,左对齐;域宽分别为10、13、7;小数点后保留2位;,例1(续),#include#include#include#include#includevoidoutputLine(int,conststring,double);intmain()/ifstreamconstructoropensthefileifstreaminClientFile(clients.dat,ios:in);if(!inClientFile)cerrnamebalance)outputLine(account,name,balance);inClientFile.close();return0;voidoutputLine(intaccount,conststringname,doublebalance)coutleftsetw(10)accountsetw(13)namesetw(7)setprecision(2)rightbalancename,s);myfilep-phoNump-codeNump-bd.yearp-bd.monthp-bd.day;rear-next=p;rear=p;myfile.close();/读取完毕,关闭文件rear-next=NULL;/链表尾结点指针赋值printabc(head);deletehead;,例2续:主函数,(1)这是用流提取运算符检查是否到文件尾;(2)还可以用函数eof()检查是否到文件尾,此时需要保证文件尾没有多余的空字符。,voidprintabc(lk*head)/打印标题行coutnext;while(p!=NULL)coutnamephoNumcodeNumbd.yearbd.monthbd.daynext;,例2续:打印链表的函数,文件中记录的组织方式,文件中记录常见的两种组织方式顺序访问文件(sequentialaccessfile)按记录关键字字段的顺序存储记录的文件。随机访问文件(randomaccessfile)按随机顺序访问存储记录的文件。,基于文件的I/O,文件的概念文件和流文件的顺序访问文件的随机访问访问有记录概念的文件,随机访问文件,顺序访问文件不适合快速访问应用程序,即要立即找到特定记录的信息。快速访问应用程序的例子有航空订票系统、银行系统、销售网点系统、自动柜员机和其他要求快速处理特定数据的事务处理系统。银行要面对成千上万的客户,但自动柜员机能在瞬间作出响应。这种快速访问应用程序是用随机访问文件(randomaccessfile)实现的。随机访问文件的各个记录可以直接快速访问,而不需要进行搜索。,文件定位指针,文件定位指针:是一个long类型的数据,指出当前读写的位置C+文件有两个定位指针:读指针和写指针当文件以输入方式打开时,读指针指向文件中的第一个字节。文件以输出方式打开时,写指针指向文件中的第一个字节。当文件以添加方式打开时,写指针指向文件尾。,文件的随机访问,指定文件定位指针的值,从任意指定位置开始读写获取文件定位指针的当前位置:成员函数tellg和tellp设置文件定位指针的位置:成员函数seekg和seekp,成员函数seekg和seekp,seekg和seekp都有两个参数:第一个参数通常为long类型的整数,表示偏移量;第二个参数可以指定寻找方向寻找方向:ios:beg(默认)相对于流的开头ios:cur相对于流当前位置ios:end相对于流结尾例子:inFile.seekg(0);将文件位置指针移到文件开头(位置0),连接inclientFile。,文件位置指针的例子,/positiontothenthbyteoffileObject/assumesios:begfileObject.seekg(n);/positionnbytesforwardinfileObjectfileObject.seekg(n,ios:cur);/positionybytesbackfromendoffileObjectfileObject.seekg(y,ios:end);/positionatendoffileObjectfileObject.seekg(o,ios:end);成员函数tellg和tellp分别返回get和put指针的当前位置location=filObject.tellg();,有了seekg,seekp等函数,是不是就可以实现对文件的正确的随机读写了呢?,随机读写实例,intmain()fstreamin(file);inti;if(!in)cerri)couti)couti;in.close();return0;,123452078910,“file”的原始记录:12345678910,0/endmain,赋值给clientdata对象(client),读入相关信息,重定位,固定长度的输入,运行时随机写入存取数据,Enteraccountnumber(1to100,0toendinput)?37Enterlastname,firstname,balance?BarkerDoug0.00Enteraccountnumber?29Enterlastname,firstname,balance?BarkerNancy-24.54Enteraccountnumber?96Enterlastname,firstname,balance?StoneSam34.98Enteraccountnumber?88Enterlastname,firstname,balance?SmithDave258.34Enteraccountnumber?33Enterlastname,firstname,balance?DunnStacey314.33Enteraccountnumber?0,三、从随机存取文件顺序读取数据,intmain()ifstreaminCredit(credit.dat,ios:in);if(!inCredit)cerr(/读第一条记录,while(inCredit,输出结果:AccountLastNameFirstNameBalance29BrownNancy-24.5433DunnStacey319.3337BarkerDoug9.0088SmithDave258.3496StoneSam34.98,outCredit.seekp(client.getAccountNumber()-1)*sizeof(ClientData);outCredit.write(reinterpret_cast(,实例:图书馆的书目管理系统,如果每本书需要记录的信息有:馆藏号(整型数):要求自动生成书名(最长20个字符的字符串)借书标记。借书标记中记录的是借书者的借书证号,假设也是整型数。该系统需要实现的功能有:初始化系统添加书借书还书显示书库信息,book类设计,数据成员:馆藏号、书名、借书标记为了提供馆藏号自动生成,需要保存系统中最大的馆藏号。这个值可以作为书目类的静态成员。成员函数:构造函数借书还书显示书的详细信息静态成员初始化静态成员值加1,book.h,#ifndef_book_h#define_book_h#include#include#include#includeusingnamespacestd;classbookintno;/馆藏号charname20;/书名intborrowed;/借书标记staticintno_total;/最大馆藏号public:,book(const
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南广播电视天线工四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北计量检定工一级(高级技师)历年参考题库含答案解析
- 康复医疗器械市场深度洞察:2025年需求爆发创新产品引领变革报告
- 2025年事业单位工勤技能-海南-海南家禽饲养员二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南林木种苗工二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-河北-河北食品检验工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江西-江西理疗技术员三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江西-江西城管监察员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏垃圾清扫与处理工一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西工程测量工五级(初级工)历年参考题库典型考点含答案解析
- 2025年秋招:新媒体运营笔试题目及答案
- 工作总结及工作思路(输电运维班)
- 感染性休克的护理诊断与措施
- Unit 14 I remember meeting all of you in Grade 7(大单元教材分析)教学课件 人教新目标九年级英语全册
- 肺炎护理试题填空及答案
- 食材配送 售后服务方案
- 安全操作规程修订要求
- 2025年四川绵阳燃气集团有限公司招聘考试笔试试题(含答案)
- 2025至2030盾构机行业市场深度研究与战略咨询分析报告
- 【公开课】物质的转化课件2025-2026学年高一上学期化学人教版(2019)必修第一册+
- (高清版)DB11∕T 509-2025 房屋建筑修缮工程定案和施工质量验收规程
评论
0/150
提交评论