您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++程序设计教程7
7第七章C++的IO流类库7.2.1C++的流§7.1C++的流及流类库输入输出是一种数据传递操作,它可以看作主机与外部介质之间的流动。流具有方向性:与输入设备(如键盘)相联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出流;与输入输出设备(如磁盘)相联系的流称为输入输出流。C++中包含几个预定义的流:标准输入流cin与标准输入设备相关联标准输出流cout与标准输出设备相关联非缓冲型标准出错流cerr与标准错误输出设备相关联(非缓冲方式)缓冲型的标准出错流clog与标准错误输出设备相关联(缓冲方式)在缺省情况下,指定的标准输出设备是显示终端,标准输入设备是键盘。在任何情况下(有时用户把标准输出设备定向为其它设备),指定的标准错误输出设备总是显示终端。cerr“Theaveragecannotbecomputed.\n”;7.2.2流类库C++流类库是用继承方法建立起来的一个输入输出类库。它具有两个平行的基类:streambuf类,ios类。所有其它的流类都是从它们直接或间接地派生出来的。使用C++的流类库,程序中可能应包含的头文件:iostream.hstrstream.hfstream.hiomanip.h1.streambuf类streambuffilebufstrstreambufconbuf派生2.ios类iosfstreambasestrstreambaseostreamistreamistrstreamofstreamostrstreamconstreamifstreamfstreamistream_withassignostream_withassigniostream_withassignstrstreamiostream7.4用户自定义类型的输入输出用户自定义的类型数据的输入或输出,可以通过重载运算符“”和“”来实现,使“”和“”可以直接用来输入或输出类的对象。7.4.1重载输出运算符“”定义输出运算符””重载函数的一般格式如下:ostream&operator(ostream&stream,class_nameobj){//操作代码returnstream;}函数中的一个参数是对ostream对象的引用,它可以是其它任何合法的标示符,但必须与return后面的标示符相同。第二个参数接受将被输出的对象,其中class_name是类名,obj为该类的对象名。例7.7(1)输出运算符“”重载的例子//例7.7(1)运算符“”重载例7.7(2)把重载输出运算符定义为类的友元函数,这样就可以访问类的私有成员//例7.7(2)运算符“”重载7.4.2重载输入运算符“”只是要把ostream换成istream,把””用””代替,第二个参数是一个引用。定义输入运算符””重载函数的一般格式如下:istream&operator(istream&stream,class_name&obj){//操作代码returnstream;}例7.11重载输入运算符“”//例7.7(2)运算符“”重载7.5文件的输入输出文件是一个字符流或二进制流,它把数据看作是一连串的字符,而不考虑记录的界限,它对文件的存取以字符为单位进行。我们把这种文件称为流式文件。在C++中,要进行文件的输入输出,必须首先创建一个流,然后将这个流与文件相关联,即打开文件,此时才能进行读写操作,完成后再关闭这个文件。这是C++中进行文件输入输出的基本过程。7.5.1文件的打开与关闭1.文件的打开为了执行文件的输入输出,C++提供了三个流类。名称基类功能ofstream由ostream派生用于文件的输出ifstream由istream派生用于文件的输入fstream由iostream派生用于文件的输入或输出建立流的过程就是定义流类的对象,例如:ifstreamin;ofstreamout;fstreamboth;它们分别定义了输入流对象in,输出流对象out,输入输出流对象both。open()函数是上述三个流类的成员函数,其原型为:voidopen(constunsignedchar*,intmode,intaccess=filebuf::openprot);打开语句:流类的对象.open(constunsignedchar*,intmode,intaccess=filebuf::openprot);其中第一个参数是用来传递文件名的;第二个参数mode的值决定文件将如何被打开,它必须取下面的值中的一个;access的值决定文件的访问方式。mode:ios::app使输出追加到文件尾部ios::ate查找文件尾ios::in打开一个文件进行读操作ios::nocreate文件不存在时,导致open()失败ios::noreplace若文件存在,则open()失败ios::out打开一个文件进行写操作ios::trunc使同名文件被删除ios::binary文件以二进制方式打开,缺省时为文本文件访问方式(access)0普通文件1只读文件2隐含文件4系统文件8备份文件打开文件的步骤:(1)定义一个类的对象,例如:ofstreamout;(2)使用open()函数打开文件。例如:out.open(”test”,ios::out,0);文件只有在打开后,才能对文件进行读写操作。由于某些原因,可能打开失败,因此使用文件之前必须进行执行检测,以确认打开一个文件是否成功。可以使用类似下面的方法进行检测:if(!mystream){cout”cannotopenfile!\n”;//错误处理代码}在实际编程时,打开一个文件的最常见的形式为:ofstreamout(”test”);用if(!out)检测是否打开成功它相当于语句:ofstreamout;out.open(”test”);2.文件的关闭关闭文件可使用close()函数完成,close函数也是流类中的成员函数,它不带参数,没有返回值,例如:out.close();7.5.2文件的读写在含有文件操作的程序中,必须有如下的预处理命令:#includefstream.h1.文本文件的读写文件打开后,文本文件的读写使用运算符“”与“”,只是必须用与文件相连接的流代替cin和cout。例7.9把一个整数、一个浮点数和一个字符串写到磁盘文件test中。//例7.9文本文件读写例7.10先建立一个输出文件,向它写入数据,然后关闭文件,再按输入模式打开它,并读取信息。//例7.10文本文件读写程序建立一个输出文件test2,并向它写入数据,关闭输出文件test2。再将文件test2按输入模式打开,并将字符串“hello!\n”读给字符数组str,将整数100读给整型变量i。最后在屏幕上显示出str和I的值,如下所示:Hello!100文件读写位置指针位置指针:用于保存在文件中进行读或写的位置。通过对位置指针的操作,适当地调整读或写的位置,可以实现对磁盘文件的随机访问。与ofstream对应的是写位置指针,指定下一次写数据的位置。相关的操作函数为:seekp函数:用于移动指针到指定位置。tellp函数:用于返回指针当前的位置。与ifstream对应的是读位置指针,指定下一次读数据的位置。相关的操作函数为:seekg函数:用于移动指针到指定位置。tellg函数:用于返回指针当前的位置。补充内容seekg函数的使用形式(seekp类似):seekg(n):用于移动指针到文件第n个字节后。seekg(n,ios::beg):从文件起始位置向后移动n个字节。seekg(n,ios::end):从文件结尾位置向前移动n个字节。seekg(n,ios::cur):从当前位置向前或向后移动n个字节。其中:n=0,在指定位置;n0,在指定位置向后移动;n0,在指定位置向前移动。tellg函数的使用形式(tellp类似):streamposn=流对象.tellg()streampos可看作整型数据,返回值保存指针当前的位置。例:已知文件data.txt中存有10个CRect对象的数据,现要求读取最后一个对象,把它的左上角坐标修改为(100,100),其他不变,修改后写回到文件中去。#includefstream.h•voidmain()•{•CRectrt;•ifstreamifs(“data.txt”);•ifs.seekg(0,ios::end);//将指针移动到文件尾•streamposlof=ifs.tellg();//求得文件长度lof•ifs.seekg(-lof/10,ios::end);//将指针移动到最后一条记录起始位置•ifs.read((char*)&rt,sizeof(CRect));•ifs.close();•rt.Move(100,100);•ofstreamofs(“data.txt”,ios::ate);//以ios::ate方式打开文件防止删除原来内容•ofs.seekp(-lof/10,ios::end);//将指针移动到最后一条记录起始位置•ofs.write((char*)&rt,sizeof(CRect));•ofs.close();•}错误处理函数eof()——如果输入流结束,到文件尾,则返回True;bad()——如果出现一个严重的、不可恢复的错误,如由于非法操作导致数据丢失、对象状态不可用等,则返回True,通常这种错误不可修复,此时不要对流再进行I/O操作;fail()——如果某种操作失败,如打开操作不成功,或不能读出数据,或读出数据的类型不符等等,则返回True;good()——如果以上三种错误均未发生,表示流对象状态正常,则返回True。以上函数可由流对象直接调用,如:if(!inf.eof())//如果没有到文件末尾,if条件满足输入输出文件流fstreamfstream类:对文件同时进行读写,它将输入和输出流的功能集于一身。使用fstream打开文件的方法:fstreamiofile(“myfile.dat”,ios::in|ios::out);注意:必须指定打开方式,因为没有默认值。在使用fstream的对象读写文件时,可以联合使用seekg和seekp函数对指针进行定位,调整正确的读写位置。例:打开文件“E:\myfile.txt”进行读写,首先读出文件内容,显示出来,再将内容写入原文件结尾,并将写入后的文件内容显示出来。•#includefstream.h•#includeiostream.h•voidmain()•{•fstreamiofile(“E:\\myfile.txt”,ios::in|ios::app);•iofile.seekg(0,ios::end);//定位至文件尾•streamposlof=iofile.tellg();//获取文件长度•char*data;•data=newchar[lof];//动态分配内存用于保存文件内容•iofile.seekg(0,ios::beg);//定位至文件头•iofile.read(data,lof);//将文件内容读到data指向的内存中•cout“原文件内容为:”endl;for(inti=0;ilof;i++)coutdata[i];//逐个输出data指向内存中的字符coutendl;iofile.write(data,lof);//打开方式为ios::app,能将读出内容写入文件尾delete[]data;iofile.seekg(0,ios::end);lof=iofile.tellg();data=newchar[lof];iofile.seekg(0,ios::beg);iofile.read(data,lof);cout“读写操作后文件内容为:”endl;for(i=0;ilof;i++)coutdata[i];coutendl;iof
本文标题:C++程序设计教程7
链接地址:https://www.777doc.com/doc-2904294 .html