第十一章 输入输出流和文件_第1页
第十一章 输入输出流和文件_第2页
第十一章 输入输出流和文件_第3页
第十一章 输入输出流和文件_第4页
第十一章 输入输出流和文件_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

C++程序设计计宋存利第十章输入输出流和文件大连交通大学本章知识要点标准流对象数据输入输出的格式化控制字符串的输入文件的输入输出文件流文件的打开关闭文件的检测文件的读写操作对文件的随机读写11.1标准流对象在C++中,输入输出数据的传送过程称之为流处理,一个流就是一个字节序列。如果字节流是从设备流向内存,这叫做输入操作(插入操作)。如果字节流是从内存流向设备,这叫做输出操作(析取操作)。C++中,将用于进行数据输入输出的类统称为流类。为了避免多继承的二义性,从ios派生出istream和ostream时,均使用了virtual继承(虚继承)。11.1标准流对象在C++中,为了方便程序对数据的读写操作,在头文件iostream中定义了四个标准流对象:cin、cout、cerr和clog。cin为istream流类对象,对应于标准输入流,默认键盘,用于从键盘读取数据。cout为ostream流类对象,对应于标准输出流,默认显示器,用于向屏幕输出数据。cerr为ostream流类对象,对应于标准错误输出流,用于向屏幕输出出错信息(非缓冲方式)。clog为ostream流类对象,对应于标准错误输出流,用于向屏幕输出出错信息。它与cerr的区别在于它先将信息输出到缓冲区,等缓冲区满或刷新时才输出到屏幕。而cerr不使用缓冲区。11.1.1数据输入输出的格式化控制C++中,在输出数据时可以进行格式控制以达到用户想要的格式效果。用输出流对象进行格式输出时,既可以通过流操纵算子进行格式化输出,也可通过输出流对象的格式控制函数。一般情况下,流操纵算子控制输出格式更方便一些。C++中常用的输出流操纵算子在头文件iomanip中定义。11.1.1数据输入输出的格式化控制【例11-1】演示流操纵算子的使用,来控制数据的格式输出。具体实现为eleventh_1.cpp注意:setw算子所起的作用是一次性的,即只影响下一次输出。每次需要指定输出宽度时都要使用setw重新设置。【例11-2】演示setw对cin流对象的影响。具体实现为eleventh_2.cpp11.1.2字符串的输入cin读取数据的规则:(1)cin在给变量读取数据时,当遇到Enter、Space、Tab键时,输入将结束。(2)当cin从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待从键盘输入数据。但是如果读取成功,字符后面的分隔符将是残留在缓冲区的,cin不做处理(这点请注意,涉及字符串的读取时有时会造成错误)。(3)如果cin在读取数据时,不想略过空白字符,可以使用noskipws流控制。比如cin>>noskipws>>input;【例11-3】cin读入字符串问题。

具体实现为eleventh_3.cpp

分析:显然程序的输出不是我们想要的,怎样才能达到想要的效果呢?11.1.2字符串的输入C++提供了丰富的库函数和类来完成字符串的输入1.gets函数

该函数在头文件<cstdio>中有声明,是一个全局函数,其函数原型为:

char*gets(char*s);

其中,参数s为char类型的字符数组名或指针,该函数的作用是从标准输入设备(键盘)读取字符串直到遇到换行符结束,但换行符会被丢弃,然后在字符串末尾添加'\0'字符。【例11-4】gets函数对【例11-3】的重新实现。

具体实现为eleventh_4.cpp11.1.2字符串的输入2.getline函数getline在头文件<string>中有声明,是一个全局函数,其函数原型为:

istream&getline(istream&is,string&str,chardelim);或是istream&getline(istream&is,string&str);其中,参数is为istream类型的对象的引用,它指明从哪个设备读入数据;参数str为string类型的引用,他是接收读入数据的对象的引用;参数delim为字符串读入时的终止字符,遇到它,则字符串对象str的读入结束。第二个函数原型的两个参数的意义同上,只是其默认的字符串结束符号为回车换行符。【例11-5】

getline函数对【例11-4】的重新实现。

具体实现为eleventh_5.cpp11.1.2字符串的输入2.getline函数getline在头文件<string>中有声明,是一个全局函数,其函数原型为:

istream&getline(istream&is,string&str,chardelim);或是istream&getline(istream&is,string&str);其中,参数is为istream类型的对象的引用,它指明从哪个设备读入数据;参数str为string类型的引用,他是接收读入数据的对象的引用;参数delim为字符串读入时的终止字符,遇到它,则字符串对象str的读入结束。第二个函数原型的两个参数的意义同上,只是其默认的字符串结束符号为回车换行符。【例11-5】

getline函数对【例11-4】的重新实现。

具体实现为eleventh_5.cpp11.1.2字符串的输入3.istream类的成员函数实现字符串的输入(1)get函数get作为istream类的成员函数,该函数的原型有三种,它们是:intget();istream&get(char&c);istream&get(char*p,intn,char='\n');【例11-6】演示cin对象成员函数get()的使用。具体实现为eleventh_6.cpp11.1.2字符串的输入(2)ignore跳过指定字符getline函数getline是istream类的成员函数,它有如下两个版本的函数原型:istream&getline(char*buf,intbufSize);istream&getline(char*buf,intbufSize,chardelimer);【例11-7】istream流类对象的getline函数使用。具体实现为eleventh_7.cpp11.1.2字符串的输入(3)ignore函数ignore是istream类的成员函数,它的原型是:istream&ignore(intn=1,intdelim=EOF);【例11-8】ignore函数的应用案例。具体实现为eleventh_8.cpp(4)peek函数peek是istream类的成员函数,它的原型是:intpeek();【例11-9】ignore函数的应用案例。具体实现为eleventh_9.cpp11.2文件的输入输出在编写程序的过程中,经常要将程序的处理结果写入到文件长期保存而不是输出到显示器。同理,常常大量的需要处理的数据事先是存放在文件中的,因此程序需要对文件进行读操作。文件是存储在存储介质上(磁盘、磁带、光盘)的数据集合。按照存储方式可以将文件分为文本文件和二进制文件。由于不同操作系统文本文件处理方式的不同,因此文本文件的可移植性较差,而二进制文件则可跨平台使用,可移植性较好。文件类型不同,其读写方式就不同。11.2.1文件流C++中,通过流对文件进行读写操作,一般需要先建立文件流,C++标准类库中有三个流类可以用于文件操作:ifstream:用于从文件中读取数据,继承自istream。ofstream:用于向文件中写入数据,继承自ostream。fstream:用于从文件中读取数据和向文件中写入数据,继承自iostream。11.2.2文件的打开关闭在程序中,对一个文件进行读写操作,首先要打开文件,而读写完后要关闭。一个文件流对象创建完成后,要与一个具体的文件建立链接,然后才能对其进行读写操作,方法是调用流类对象的成员函数open(),该函数的作用为:通过指定文件名,建立起文件和文件流对象的关联并打开文件,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。11.2.2文件的打开关闭在程序中,对一个文件进行读写操作,首先要打开文件,而读写完后要关闭。一个文件流对象创建完成后,要与一个具体的文件建立链接,然后才能对其进行读写操作,方法是调用流类对象的成员函数open(),该函数的作用为:通过指定文件名,建立起文件和文件流对象的关联并打开文件,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。11.2.2文件的打开关闭以ifstream类为例,该类有一个open成员函数,其他两个文件流类也有同样的open成员函数,其函数原型为:voidopen(constchar*FileName,intmode,intaccess);其中,第一个参数FileName是指向文件名的字符指针。11.2.2文件的打开关闭在创建文件流时,可利用流类的带参构造函数完成流的创建以及文件的打开操作,具体文件流类的带参数的构造函数为:ifstream(constchar*FileName,intmode=ios::in,int=0);ofstream(constchar*FileName,intmode=ios::out,int=0);ftream(constchar*FileName,intmode,int=0);对文件读写操作完成之后,应该将文件流对象关闭,这时可调用流类对象的成员函数close()完成。关闭文件将断开文件流类对象和文件之间的链接关系,如果是对文件进行的写操作,则在关闭文件时,同时会将文件缓冲区中的数据写入文件。关闭文件后,文件流对象仍然存在,可用它的成员函数open()再次建立和其他文件的链接关系。11.2.3文件的检测C++的每一个流,都有流状态标志位,用来标志流的状态,利用流类提供的成员函数,程序员可了解流的状态信息,以便能正确对流进行操作。表10.5是流的状态标志位及其解释,表10.6是流类提供的状态检测函数。11.2.4文件的读写操作1.文本文件的读取和写入使用文件流对象打开文件后,文件就成为一个输入流或输出流,对流类对象的使用,就可以象对cin和cout的使用一样。【例11-10】编写一个程序,将文本文件in.txt的整数拷贝到文本文件out.txt中,文件和应用程序放在相同位置。具体实现为eleventh_10.cpp11.2.4文件的读写操作2.二进制文件的读取和写入读写二进制文件不能使用前面提到的类似于cin、cout从流中读写数据的方法。这时可以调用ifstream类和fstream类的read成员函数从文件中读取数据,调用ofstream和fstream的write成员函数向文件中写入数据。(1)用ostream::write成员函数写文件ostream&write(char*buffer,intcount);(2)用istream::read成员函数读二进制文件istream&read(char*buffer,intcount);(3)用文件流类的put和get成员函数读写文件11.2.4文件的读写操作【例11-11】编写一个程序,用二进制文件保存时间对象。通过命令行窗口,从键盘输入若干时钟时、分和秒的数值(每个对象输入完成后换行,全部输入结束时,按回车+Ctrl+Z+回车),并以二进制文件形式存储为一个时间记录文件clock.dat。

具体实现为eleventh_11.cpp【例11-12】将例【例11-11】创建的时间记录文件clock.dat的内容读出并显示在屏幕上。完成二进制文件的读操作案例。具体实现为eleventh_12.cpp【例11-13】利用文件流类的put和get成员函数实现文件内容的复制。具体实现为eleventh_13.cpp11.2.5对文件的随机读写在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。ifstream类和fstream类有seekg成员函数,可以设置文件读指针的位置;ofstream类和fstream类有seekp成员函数,可以设置文件写指针的位置。所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是0。函数的原型如下:ostream&seekp(intoffset,intmode);istream&seekg(intoffset,intmode);11.2.5对文件的随机读写此外,我们还可以得到当前读写指针的具体位置:ifstream类和fstream类的tellg成员函数能够返回文件读指针的位置;ofstream类和fstream类的tellp成员函数能够返回文件写指针的位置。函数原型如下:inttel

温馨提示

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

评论

0/150

提交评论