第9章 C++的输入输出_第1页
第9章 C++的输入输出_第2页
第9章 C++的输入输出_第3页
第9章 C++的输入输出_第4页
第9章 C++的输入输出_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1、1第九章 C+的I/O 流(Input/Output)2主要内容1. I/O流概述2. 输入和输出格式控制3. 输入与输出类4. 流的错误检测5. 文件输入与输出6. 用户自定义的类型的输入与输出31. C+I/O 流概述4 在C中I/O函数是定义在标准函数库stdio.h, conio.h中; 而在C+中,这些函数是类的成员函数,皆属于专用I/O的类,如iostream.h。5 C+C+语言是通过语言是通过I/OI/O流来实现输入流来实现输入/ /输出的输出的。I/O流不是C+语言的一部分,而是标准C+库的一部分,是C+类的一个集合; C+完全支持C语言的I/O系统; C+还可以支持用户自定

2、义的各种类的对象的输入输出,支持面向对象的特征。6C+I/O流类库流(stream)是数据流的通用名字。通过流的概念,可以将要输入或者输出的数据看作一个字节流,而不必考虑具体所访问的特定设备的细节。7 C+流库是用继承方式建立起来的一个输入输出类库。8流库的优点 用流类代替传统的C函数,例如printf(),scanf(), fprintf(), fscanf()等有如下优点。简化。在流中没有%d, %f这种格式化的字符。可以重载已有的运算符和成员函数。9C+I/O流类库的结构通过继承关系构造的流类库结构ios状态设置状态设置streambuf数据缓冲数据缓冲istream格式化输入流格式化输

3、入流ostream格式化输出流格式化输出流iostream输入输入/输出流输出流ifstream输入文件流输入文件流ofstream输出文件流输出文件流fstreambase文件流文件流strstreambase串流串流istream_withassignOstream_withassign10 类iosios是最基本类,主要用来控制与保存数据流的状态。派生出isteam,ostream, fstreambase,strstreambase。istream,ostreamistream,ostream分别用于输入与输出。 类istream包括成员函数get(), getline(), read

4、()和重载的输入运算符()等; 类ostream包括put(), write()和重载的输出运算符()等。11iostream 通过多重继承由isteam和ostream派生而来,可以用于同时进行输入输出的设备,如磁盘文件。strstreambase专门处理字符串流。fstreambase提供文件流的公共操作,如打开,关闭文件,返回所用的缓冲区等等。12 类streambuf主要负责缓冲区的处理,提供对缓冲区的低级操作。例如,设置缓冲区,从缓冲区存储或取出字符等等。streambuf主要是作为流库中类的基类。派生出strstreambuf, filebuf和conbuf。13标准输出流 标准输

5、出流是流向标准输出设备(屏幕)的数据。 cout, cerr和clog流cout除了向屏幕输出外,也可以输出到磁盘文件。cerr是不经过缓冲区,直接向屏幕输出错误信息;clog中的信息存放在缓冲区中,直到缓冲区满后或遇到endl时向屏幕输出。142. 输入输出的格式控制15一般要进行输入输出格式控制有两种使用方法:1. iosios类中的相关成员函数类中的相关成员函数2. 操纵函数。操纵函数。162.1 用控制符函数(manipulators)控制I/Omanipulators 不属于任何类的成员,其定义在iostream.h与iomanip.h中,manipulators 可以对所有I/O的

6、数据流作格式化处理。17181. flushflush 将缓冲区(buffer)中的数据流强迫输出。cout“Hello World!”flush;2. endl, endsendl, ends ends用来将一空字符插入字符串中:coutends;193. . setw(int), setfill(int)setw(int), setfill(int) setwsetw用来设定数据流的宽度,仅对下一个流输出或输入操作有效。输出时,当数据长度小于宽度时,所有数据向右靠齐,大于宽度时,全部输出;输入时,数据长度大于宽度,数据将被截断。coutsetw(10)“Hello!”setw(10)str

7、ing;20#include #include Void main()int i = 6789;int j = 1234;int k = 10;coutsetw(6)ijk“n”;coutsetw(7)isetw(6)jsetw(6)k;输出为:6789123410 6789 1234 1021 setfill用来将setw所设定宽度的未填入数据的部分填入指定的字符:coutsetfill(.);coutsetw(10)“test”endl;输出为:. . . . . .test22.setprecision(int)setprecision(int)设定浮点数小数点后的精确位数。coutse

8、tprecision(2);5.5. dec, hex, octdec, hex, oct与与setbase(int)setbase(int)转换数值进制,如同C中的%d,%x,%ocoutdec10endl;couthex16endl;coutoct8endl;可以用setbase更改输出格式的默认值:coutsetbase(16); /默认改为couthex格式232.2 用类ios成员函数格式化类类ios中包含着有关数据流格式化的数据成员与成员函数。中包含着有关数据流格式化的数据成员与成员函数。类类ios定义的位于定义的位于public区的格式化状态标记区的格式化状态标记(数据成员)数据

9、成员)enumskipws = 0 x0001 /skip whitespace on inputleft= 0 x0002/left-adjust outputright= 0 x0004/right-adjust putputdec=0 x0010/decimal conversionoct=0 x0020/octal conversionhex=0 x0040/hexidecimal conversionshowbase=0 x0080/use base indicator on outputshowpoint=0 x100 /force decimal pointuppercase=0

10、 x200/upper-case hex outputshowpos =0 x0400/add + to positive integersscientific =0 x0800/use 1.2345E2 floating notationfixed=0 x1000/use 123.45 floating notation;2425 这些成员属于enum类型,又在ios的public区,所以可以直接引用而不必通过ios的对象,但需加上范围运算符指明其所属范围:26在在ios类中控制输入输出的成员函数有:类中控制输入输出的成员函数有: int ios:width(); /返回当前的宽度设置返回当

11、前的宽度设置int ios:width(int w); /设置宽度并返回前一次的设置设置宽度并返回前一次的设置int ios:precision(int p); /设置精度并返回前一次设置值设置精度并返回前一次设置值char ios:fill(); /返回当前空位填充的字符返回当前空位填充的字符char ios:fill(char ch); /设置空位填充字符设置空位填充字符long ios:setf(long flags); /设置状态标志设置状态标志long ios:unsetf(long flags); /清除状态标志清除状态标志long ios:flags(); /取状态标志取状态标志

12、long ios:flags(long flags); /设置状态标志并返回前一次设置状态标志并返回前一次的状态标志的状态标志ios类的成员函数271. 利用函数flags和setf可以设置状态标志,使用时通过cout或cin:cout.flags(ios:oct);cout.flags(ios:oct);/设定数值以八进制格式输出cout.setf(ios:right);cout.setf(ios:right); /设定字符串输出时靠右对齐cout.setf(ios:hex);cout.setf(ios:hex);/设定数值以十六进制格式输出28使用manipulators也可达到同样效果。

13、coutoct;coutsetionsflags(ios:right); /设定字符串输出时靠右对齐coutresetionsflags(ios:right); /清除靠右对齐格式注意:任何注意:任何manipulatormanipulator都必须经过都必须经过来来使用。而调用类使用。而调用类iosios的成员函数必须通过对象,的成员函数必须通过对象,一般通过一般通过cincin或或coutcout29 另外,另外, setfsetf还可设置以下的状态标志:还可设置以下的状态标志:showbaseshowbase显示目前的数值格式显示目前的数值格式showpointshowpoint显示小数

14、点以后的零位部显示小数点以后的零位部分分uppercaseuppercase十六进制格式以大写字母十六进制格式以大写字母显示显示showposshowpos 正数前加上正数前加上+ +例如:例如:cout.setf(ios:showpoint);cout.setf(ios:showpoint);cout.precision(4);cout.precision(4);cout1.11;cout所有基本类格式化读入所有基本类格式化读入get(ch)读入一个字符到读入一个字符到ch中中get(str)读入字符串到数组读入字符串到数组str中,直到遇到中,直到遇到nget(str,MAX)读入字符到数

15、组读入字符到数组str中,直到遇到中,直到遇到MAX个字符个字符get(str,DELIM)读入字符到数组读入字符到数组str中中, 直到遇到分界符直到遇到分界符n,把它保把它保存存在流中在流中get(str,MAX,DELIM) 读入字符到数组读入字符到数组str中中,直到经过直到经过MAX个字符或遇到分个字符或遇到分界符界符DELIM,把它保存在流中把它保存在流中getline(str,MAX,DELIM)读入字符到数组读入字符到数组str中中,直到经过直到经过MAX个字符或遇到分个字符或遇到分界符界符DELIM, 读入分界符读入分界符putback(ch)插入读入的最后字符到输入流中插入

16、读入的最后字符到输入流中ignore(MAX,DELIM)读入并丢弃最多读入并丢弃最多MAX个字符,直到遇到个字符,直到遇到DELIMpeek(ch)读入一个字符,把它保留在流中读入一个字符,把它保留在流中cout=gcount()返回前面调用返回前面调用get(),getline,read()所读到的字符数所读到的字符数read(str,MAX)处理文件,读入最多处理文件,读入最多MAX个字符到个字符到str, 直到直到EOFseekg()设置从文件开始位置的指针偏移距离(字节数)设置从文件开始位置的指针偏移距离(字节数)seekg(pos,seek_dir)设置从文件开始位置的指针偏移距离

17、(字节设置从文件开始位置的指针偏移距离(字节数数),seek_dir可以是可以是ios:be, ios:cur, ios:endpos=tellg(pos)返回从文件开始位置的指针偏移距离(字节数)返回从文件开始位置的指针偏移距离(字节数)343.2 ostream 类 类ostream处理输出操作函数函数用途用途所有基本类型的格式化插入所有基本类型的格式化插入put(ch)插入字符插入字符ch到流中到流中flush()刷新缓冲区刷新缓冲区write(str,SIZE)输出长度为输出长度为SIZE的的strseekp(position)设置从文件开始位置的指针偏移距设置从文件开始位置的指针偏移

18、距离(字节数)离(字节数)seekp(position,seek_dir) 设置从文件开始位置的指针偏移距离(字设置从文件开始位置的指针偏移距离(字节数)节数),seek_dir可以是可以是ios:beg, ios:cur,ios:end;pos=tellp()返回从文件开始位置的指针偏移距离(字节数)返回从文件开始位置的指针偏移距离(字节数)354. 流的错误检测36 流的错误状态包含在类ios的enum成员中/stream status bitsenum io_stategoodbit =0 x00, /无错无错eofbit =0 x01, /文件尾文件尾failbit =0 x02, /

19、操作失败操作失败badbit =0 x04, /不合法操不合法操作作hardfail =0 x80 /不可修复的错误不可修复的错误;流的错误状态37 下列函数可以操作这些数据成员: int good();int good(); /无错,返回trueint eof();int eof(); /当数据流已达尾部,则返回trueint bad();int bad(); /当数据流发生错误操作,返回trueint fail()int fail() /当数据流的某项操作失败时,返回trueclear(int)clear(int) /如无参数,则清除所有错误,否则如同:clear(ios:failbit)

20、处理错误的相关函数38错误检测的应用1. 1. 输入数字输入数字怎么处理输入数字时产生的错误,如键盘输入的不是数字,可以通过检查goodbit的值来处理。39while(true)couti;if(cin.good()/if no errors cin.ignore(10, n);/remove newlinebreak;cin.clear();/clear the error bitscout“Incorrect input”;cin.ignore(10, n);/remove newlinecout“integer is “i;/error-free integer402. 2. 多余的字

21、符多余的字符输入后仍然有额外的字符残留在输入流中,然后作为下一步操作的输入,常见的有换行符保留在里面。可以用istream的成员函数ignore(MAX, DELIM),如:cin.ignore(10, n);读到10个字符,包括字符n,然后从输入中移去它。413. 3. 按回车而无输入按回车而无输入用户在被提示输入数字时,没有输入任何数字,只是简单的按下了回车,重复按回车会导致光标向下移动,整个屏幕向上滚动。处理方法:让输入流不忽略空白符,可以由清除skipws标志来处理:42coutcouti;cini;if(cin.good()if(cin.good() /no error /no er

22、ror/error/error见例:见例:englerr.cppenglerr.cpp435. 文件的输入与输出44 大多数的程序都涉及到文件的操作,需要把数据存入文件或从文件中读出数据。 文件输入输出也分为二进制和文本方式,也要首先创建流,将该流与某个具体文件相关联(打开文件),然后进行读写操作,最后关闭该文件。45 使用3种流类进行文件的输入输出:ifstreamifstream、ofstreamofstream、fstreamfstream它们的基类分别是istreamistream、ostreamostream、iostreamiostream。作为输入的类:ifstreamifstr

23、eam作为输出的类:ofstreamofstream作为输入和输出的类:fstreamfstream465.1 文件的打开与关闭 文件的打开文件的打开要想对一个文件进行读或写操作,在读或写操作前必须将其打开。使用函数open() 包含路径的文件名文件的打开方式为文件的存取属性47 打开输入文件时,filemode默认值为ios:inios:in 打开输出文件时,filemode默认值为ios:outios:out openprot一般使用系统默认值。4849open()open()函数有如下的使用方式:函数有如下的使用方式:(1). 通过调用ifstream流类的对象的成员函数open()打开

24、一个读文件,即从文件里读出(输入)数据。ifstream infile;ifstream infile; /创建一个ifstream对象infile.open(infile.open(“studentstudent”,ios:app);/,ios:app);/打开文件或者直接写为:ifstream infile(ifstream infile(“studentstudent”); ); 50 如果需要指定文件路径,路径中的“”号必须使用转义字符表示。例如: ifstream ifstream infile(infile(“c:projectstudent.txtc:projectstudent

25、.txt”); );51(2). 通过调用ofstream流类的对象的成员函数open()打开一个写文件,即写入(输出)数据到文件里。与ifstream相似:ofstream outFile;outFile.open(“student”);52(3). 通过调用fstream流类的对象的成员函数open()打开一个可供读写文件。类似地:fstream outFile;outFile.open(“student”,ios:in|ios:out);53 文件的关闭文件的关闭文件读写操作完成后必须及时关闭,将已打开的对象outFile关闭,可用:outfile.close();outfile.clo

26、se(); 545.2 将数据(文本)写入文件 将数据写入文件,必须先打开文件。例如,用put(char ch)函数将字符变量ch中所存的字符写入到输出文件中。见例:ochar.cpp另见例:Formato.cppFormato.cpp程序中:outfilech j对象outfile的行为类似于cout, 可以使用读出文件中的数据。见例:formati.cpp 用函数get()输入单个字符 见例:ichar.cpp 使用类ios的成员函数rdbuf()rdbuf()见例:ichar2.cpp565.4 二进制文件的读取 二进制方式以 bit为单位读写文件。 cin, cout和不适用于二进制方

27、式读写文件。57 二进制方式读写有专用的若干函数: 写入使用write()write()函数,读出使用read()read()函数。这两个函数以char类型为参数,所以传入的参数地址必须进行强制类型转换。ostream& ostream& write ( const charwrite ( const char* * str , , streamsize streamsize n ); ); istream& istream& read (const charread (const char* * s, streamsize , streamsize n );

28、); 打开二进制文件时,要在open()函数中加上ios:binaryios:binary方式。见例:binio.cpp585.5 文件的随机读取 一般情况下,读写数据都是从文件头开始,直到遇到文件尾,有的情况下,要求可以在文件的任意位置进行读写,这时就需要把数据随机地写入或读出文件。595.1.1 文件的随机读出 函数:istream& seekg(streampos offset, istream& seekg(streampos offset, ios:seek_dir dir);ios:seek_dir dir);将读取数据的开始点定于相对于文件某个位置指定字节长度的地

29、方。说明:(1) stream offset: 距文件某个位置的相对偏移量,一个整数。60(2) ios:seek_dir dirios:seek_dir dir: 指定偏移类型,有如下三种: ios:begios:beg 基于文件首的偏移 ios:curios:cur 基于文件当前读写位置的偏移 ios:endios:end 基于文件尾的偏移 见例:seekg.cpp615.1.2 文件的随机写入 类似于文件的读出,文件的随机写入可用函数:ostrea& seekp(streampos offset, ios:seek_dir ostrea& seekp(streampos offset, ios:seek_dir dir);dir);说明:(1) stream offsets

温馨提示

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

评论

0/150

提交评论