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

下载本文档

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

文档简介

第9章

C++的输入和输出

9.1C++为何建立自己的输入输出系统

因为在C++中用户需要定义众多的自定义类型,但是C语言的输入输出系统不支持用户自定义的类型。请看下面的类:classmy_class{

inti;floatf;char*str;}obj;

对此类类型,在C语言中下面的语句是不能接受的:

printf("%my_class",obj);C++的流类比C的输入输出函数具有更大的优越性。

9.2C++的流库及其基本结构

9.2.1C++的流

凡是数据从一个地方传输到另一个地方的操作都是流的操作。流总是与某一设备相联系的(例如键盘、屏幕或硬盘等),通过使用流类中定义的方法,就可以完成对这些设备的输入输出操作。流具有方向性:与输入设备(如键盘)相联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出流;与输入输出设备(如磁盘)相联系的流称为输入输出流。

在C++程序中,对数据的输入输出是以字节流实现的。在输入操作中,字节序列从输入设备流向内存;在输出操作中,字节序列从内存流向输出设备。在C++中,流类是为输入输出提供的一组类,它们都放在流库中。

文件(File)是一个物理概念,代表存储着信息集合的某个外部介质,它是C++语言对具体设备的抽象。例如,磁盘文件,显示器,键盘。

当程序与一个文件交换信息时,必须通过“打开文件”的操作将一个文件与一个流(类对象)联系起来。一旦建立了这种联系,以后对该流(类对象)的访问就是对该文件的访问,也就是对一个具体设备的访问。可通过“关闭文件”的操作将一个文件与流(类对象)的联系断开。

3.C++的基本流类库

头文件“iostream.h”中说明(预定义)了一批基本流类:

ios--基本流类的基类;

istream--由ios派生,支持输入(提取“>>”)操作;ostream--由ios派生,支持输出(插入“<<”)操作;iostream--由istream与ostream共同派生,支持输入和输出双向操作。

C++预定义的流有:istreamcin;--对象cin对应于键盘文件ostreamcout;--对象cout对应于显示器文件ostreamcerr;--对象cerr对应于显示器文件ostreamclog;--对象clog对应于显示器文件程序中可直接对上述4个预定义流类对象进行读写,而不必先进行“打开文件”的操作,使用完后也不需要进行“关闭文件”的操作。(因为这些流类对象与文件之间的联系是预定义好的,可认为系统已为每一程序都隐含进行了对它们的打开与关闭操作)。

Cerr和clog都是用来输出出错信息的。Cerr是不经过缓冲区,直接向显示器输出有关信息。Clog中的信息存放在缓存区中,缓冲区满后或遇上endl时,向显示器输出。4.C++的文件流类库

从逻辑概念上来说,普通磁盘文件与标准设备(键盘、显示器)文件没有本质的区别,标准流cin、cout等与文件流大致相当。不过,在具体细节上还是有些区别。因此,在头文件“fstream.h”中说明(预定义)了一批文件流类,专用于磁盘文件:

ifstream--由istream派生,支持从磁盘文件中输入(读入)数据;ofstream--由ostream派生,支持往磁盘文件中输出(写出)数据;fstream--由iostream派生,支持对磁盘文件进行输入和输出数据的双向操作。C++中没有预定义的文件流(类对象),程序中用到的所有文件流类对象都要进行自定义。9.3预定义类型的输入输出

9.3.1无格式输入输出基于C++类库的输入输出需使用两个流对象cin和cout,还要用与之相配套的两个输入输出运算符“>>”和“<<”,其一般的格式为

cin>>变量;//输人

cout<<常量或变量;//输出

9.3.2格式化输入输出

C++提供了两种进行格式控制的方法:1.使用ios类中有关格式控制的成员函数进行格式控制;2.使用称为操纵符的特殊类型的函数进行格式控制。

1.用ios类的成员函数进行格式控制

格式控制主要是通过对状态标志字的操作来完成的。在ios类的public部分定义了一个枚举,它的每个成员分别定义状态标志字的一个位,每一位都称为一个状态标志位。enum{skipws=0x0001.//跳过输入中的空白,可用于输出left=0x0002.//左对齐输出,可用于输出right=0x0004.//右对齐输出,可用于输出internal=0x0008.//在符号位和基指示符后填入字符,可用于输出dec=0x0010.//转换基制为十进制数,可用于输入或输出oct=0x0020.//转换基制为八进制数,可用于输入或输出hex=0x0040.//转换基制为十六进制数,可用于输入或输出showbase=0x0080.//在输出时显示基指示符,可用于输入或输出showpoint=0x0100.//在输出时显示小数点,可用于输出

uppercase=0x0200.//在以科学表示法格式E和以十六进制输出字母时,用大写表示,用于输出。showpos=0x0400.//对正整数显示正号,可用于输出scientific=0x0800.//用科学表示法显示浮点数,可用于输出fixed=0x1000.//用定点形式显示浮点数,可用于输出unitbuf=0x2000.//在输出操作后立即刷新所有流,可用于输出stdio=0x4000.//在输出操作后刷新stdout和stderr,可用于输出};

表1控制输入输出格式的成员函数

函数原型

功能

longios∷setf(longflags);longios∷unsetf(longflags);intios∷width(intw);intios∷precision(intp);charios∷fill(charch);设置状态标志flags清除状态标志,并返回前状态标志设置域宽w,返回以前的设置设置小数位数p,返回以前的小数位数设置填充字符ch,返回当前的填充字符C++提供的预定义操纵符如下:(1)dec以十进制形式输入或输出整型数,可用于输入或输出。(2)hex以十六进制形式输入或输出整型数,可用于输入或输出。(3)oct以八进制形式输入或输出整型数,可用于输入或输出。(4)ws用于在输入时跳过前导的空白符,可用于输入。(5)endl插入一个换行符并刷新输出流,仅用于输出。(6)ends插入一个空字符’\0’,通常用来结束一个字符串,用于输出(7)flush刷新一个输出流,仅用于输出2使用预定义的操纵符进行输入输出格式控制(8)setbase(intn)设置转换基格式为为n(n的取值为0、8、10或16),n的缺省值为0,即表示采用十进制,仅用于输出。(9)resetiosflags(longf)关闭由参数f指定的格式标志,可用于输入或输出(10)setiosflags(longf)设置由参数f指定的格式标志,可用于输入或输出(11)setfill(intch)设置ch为填充字符,缺省时为空格,可用于输入或输出(12)setprecision(intn)设置小数部分的位数,可用于输入或输出(13)setw(intn)设置域宽为n,可用于输入或输出

例9.4操纵符的使用。 #include<iostream.h> #include<iomanip.h> main() {cout<<setw(10)<<123<<567<<endl;//① cout<<123<<setiosflags(ios::scientific)<<setw(20)//② <<123.456789<<endl; cout<<123<<setw(10)<<hex<<123<<endl;//③ cout<<123<<setw(10)<<oct<<123<<endl;//④ cout<<123<<setw(10)<<dec<<123<<endl;//⑤ cout<<resetiosflags(ios::scientific)<<setprecision(4)//⑥ <<123.456789<<endl; cout<<setiosflags(ios::left)<<setfill('#')<<setw(8)//⑦ <<123<<endl; cout<<resetiosflags(ios::left)<<setfill('$')<<setw(8)//⑧ <<456<<endl; return0;}

程序运行结果为:123567①1231.234567e+02②1237b③7b173④173123⑤123.4568⑥123#####⑦$$$$$456⑧3.用户自定义的操纵符

若为输出流定义操纵符函数,则定义形式如下:

ostream&manip_name(ostream&stream){…//自定义代码returnstream;}

若为输入流定义操纵符函数,则定义形式如下:

istream&manip_name(istream&stream){…//自定义代码returnstream;}例9.5为输出流定义操纵符函数。 #include<iostream.h> #include<iomanip.h> ostream&output1(ostream&stream) {stream.setf(ios::left); stream<<setw(10)<<hex<<setfill(’&’); returnstream; } intmain() {cout<<123<<endl; cout<<output1<<123<<endl; return0; }例9.6为输入流定义操纵符函数。 #include<iostream.h> #include<iomanip.h> istream&input1(istream&in) {in>>hex; cout<<"Enternumberusinghexformat:"; returnin; } intmain() {inti; cin>>input1>>i; cout<<"***"<<hex<<i<<"***"<<dec<<i<<"***"<<endl; return0; }9.4.1重载输出运算符“<<”

定义输出运算符“<<”重载函数的一般格式如下:

ostream&operator<<(ostream&out,class_name&obj){out<<obj.item1;out<<obj.item2;...out<<obj.itemn;returnout;}

9.4.2重载输入运算符“>>”

定义输入运算符函数“>>”重载函数的一般格式如下:

istream&operator>>(istream&in,class_name&obj){in>>obj.item1;in>>obj.item2;...in>>obj.itemn;returnin;}

例9.7输出运算符“<<”重载。#include<iostream.h>classcoord{intx,y;public:coord(inti=0,intj=0){x=i;y=j;}friendostream&operator<<(ostream&stream,coord&ob);};ostream&operator<<(ostream&stream,coord&ob){stream<<ob.x<<","<<ob.y<<endl;returnstream;}main(){coorda(55,66),b(100,200);cout<<a<<b;return0;}例9.8输入运算符“<<”重载。#include<iostream.h>classthree_d{ public:three_d(inta,intb,intc) {x=a;y=b;z=c;}friendostream&operator<<(ostream&output,three_d&ob);friendistream&operator>>(istream&itput,three_d&ob);private:intx,y,z; }; ostream&operator<<(ostream&output,three_d&ob) {output<<ob.x<<","; output<<ob.y<<","; output<<ob.z<<endl; returnoutput; }

istream&operator>>(istream&input,three_d&ob) { cout<<"Enterx,y,zvalue:"; input>>ob.x; input>>ob.y; input>>ob.z; returninput; } main() { three_dobj(10,20,30);//定义类three_d的对象obj cout<<obj;//输出对象obj的成员值 cin>>obj;//输入对象obj的各成员值,将原值覆盖 cout<<obj;//输出对象obj的成员值(新值) return0; }9.5文件的输入输出在一个程序中当需要进行标准I/O操作时,则必须包含头文件iostream.h。当需要进行文件I/O操作时,则必须包含头文件fstream.h。C++中没有预定义的文件流类对象(如cin、cout对象),要进行文件的读写,首先必须建立一个文件流对象,然后把这个流对象与实际文件相关联(称为打开文件)。一旦流与文件连接后,就可以使用流类的各种功能对文件操作。对文件操作完成后,需要关闭文件。

对自定义磁盘文件进行读写的一般处理过程:创建文件流对象=>打开文件=>读写操作=>关闭文件。9.5.1文件的打开与关闭1.文件的打开为了对一个文件进行读写操作,应先“打开”该文件;在使用结束后,则应“关闭”文件。在C++中,打开一个文件,就是将这个文件与一个流建立关联;关闭一个文件,就是取消这种关联。

要执行文件的输入输出,须做三件事:(1)在程序中包含头文件fstream.h;(2)建立流。建立流的过程就是定义流类的对象,例如:ifstreamin;ofstreamout;fstreamboth;分别定义了输入流对象in;输出流对象out,输入输出流对象both。(3)打开文件文件的打开有两种方式。(1)利用流对象的构造函数打开文件。(2)利用open函数打开文件。open()函数是定义在类ifstream、ofstream和fstream中的成员函数。文件流对象.open(文件名,使用方式)打开方式1举例:

ofstreamoutfile1("myfile1.txt");

创建ofstream类的对象outfile1;使流类对outfile1与磁盘文件“myfile1.txt”相联系;并打开用于“写”(输出)的磁盘文件"myfile1.txt"。打开方式2举例:

ofstreamoutfile1;//创建ofstream类的对象outfile1outfile1.open(“myfile1.txt”,ios::out);//显式调用成员函数open来打开文件文件的输入输出方式参数有默认值,对于类ifstream,文件使用方式的默认值为ios::in,而对于类ofstream,文件使用方式的默认值为ios::out.文件打开方式作用ios::in打开一个输入文件。用这个标志作为ifstream的打开方式,可避免删除一个已有的文件中的内容ios::out打开一个输出文件,对于ofstream对象,该方式是隐含的ios::app以输入方式打开文件,写入的数据添加到文件尾部ios::ate打开一个已有文件,把文件指针移到文件结尾ios::nocreate如果一个文件已存在,则打开它,否则失败ios::noreplace打开一个文件,若文件不存在,则建立新文件,若文件存在,则打开失败。ios::trunc打开一个文件。如果文件存在,删除旧的文件。若文件不存在,则建立新文件。ios::binary打开一个二进制文件,如果不指定此方式,默认为文本文件表2文件打开方式(4)进行读写操作。在建立(或打开)的文件基础上执行所要求的输入或输出操作。(5)文件的关闭在使用完一个文件后,应该把它关闭。所谓关闭,实际上就是使打开的文件与流“脱钩”。关闭文件可使用close()函数完成,close()函数也是流类中的成员函数,它不带参数,不返回值。例如:out.close();将关闭与流out相联接的文件。

9.5.2文件的读写

1.文本文件的读写一旦文件打开了,从文件中读取文本数据与向文件中写入文本数据都十分容易,只需使用运算符“<<”与“>>”就可以了,只是你必须用与文件相联接的流代替cin和cout。

例9.9把一个整数、一个浮点数和一个字符串写到磁盘文件test中。#include<fstream.h> intmain() {ofstreamfout("test"); if(!fout) {cout<<"Cannotopenoutputfile\n,"; return1; } fout<<10<<""<<123.456<<"\"Thisisatextfile.\"\n"; fout.close(); return0; }

2.二进制文件的读写

(1)用get()函数和put()函数读写二进制文件get()函数有许多格式,其中最常用的版本原型如下:

istream&get(char&ch);get()函数从相关流中只读一个字节,并把该值放入ch中并返回该流,当到达文件尾时,使该流的值为0。put()函数的原型如下:

ostream&put(charch);put()函数将ch写入流中并返回该流。例9.11将‘a’至‘z’的26个英文字母写入文件,而后从该文件中读出并显示出来。#include<iostream.h>#include<fstream.h>voidtest_write(){ofstreamfs("d:\\test.dat"); inti; charc='a'; for(i=0;i<26;i++){fs.put(c);c++;}}voidtest_read(){ifstreamfs("d:\\test.dat"); charc; while(fs.get(c))cout<<c;}voidmain(){test_write();test_read();}(2)用read()函数和write()函数读写二进制文件

read()和write()原型如下:

istream&read(unsignedchar*buf,intnum);ostream&write(constunsignedchar*buf,intnum);例9-12用write()函数向文件test中写入整数与双精度数。 #include<iostream.h> #incl

温馨提示

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

评论

0/150

提交评论