《C++程序设计》课件第5章_第1页
《C++程序设计》课件第5章_第2页
《C++程序设计》课件第5章_第3页
《C++程序设计》课件第5章_第4页
《C++程序设计》课件第5章_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第5章流处理5.1C++流的概念

5.2输入/输出流

5.3输入/输出的格式控制

5.4文件操作

5.5字符串流

本章小结习题

为程序设计语言提供一种通用的输入/输出(I/O)功能是一项困难的工作。按照传统,I/O功能完全是为了处理几种基本数据类型而设计的。任何不平凡的C++ 都会使用到许多用户自定义类型,因此就必须处理这些类型的输入/输出问题。如果能把所有平常的“容器”——标准的I/O函数、文件以及内存块看做同样的对象,使用同样的接口进行操作,这样不是很好吗?

C++的设计就是要用户可以定义新类型,使这些自定义的类型的使用跟内部类型一样方便而有效。一种I/O机制应该是简单的、方便的、使用起来安全的、有效而灵活的,当然最重要的应该是完整的。因此,就应该使用户有可能提供另外的I/O机制,并有可能去扩充标准I/O功能,以适应特定应用的需求。在C++里,应该只用每个程序员都能用的那些机制为C++提供一种I/O机制。下面首先介绍流的概念,再详细介绍面向标准设备的输入流和输出流、对文件操作的文件流以及字符串流。5.1C++ 流的概念在C++ 程序设计中,流表示一系列流动的数据,就像水流一样,有连续不断的意思。流的一个主要特征就是单向的,一个输入/输出流是一系列向某个方向移动的字节或字符。在程序设计中经常要用到的流是标准输入和标准输出,文件也被看做流。通常是将一个文件流从磁盘读入内存,或将一个文件流写入磁盘。流是对输入/输出、字符串和文件的操作统一起来而抽象的一个概念,以方便对这些对象的操作。它们的共同特征就是可以连续不断地处理对象。C++ 的输入/输出流类库主要有三种类型的流:控制台、磁盘文件和字符串流。读者可以获得一个输入流(通过istream类或其子类对象)、一个输出流(ostream类或其子类对象)或同时实现两种功能的流(使用iostream或其子类对象)。C++的输入/输出由标准库提供。标准库定义了一组类,支持对文件和控制窗口等设备的读/写(I/O)。还可以读/写存储在内存中的string对象,使string对象能够像文件一样操作,从而使我们无须I/O就能实现数据与字符的转换。此外,一般来说,类的设计者还可以很方便地使用I/O标准库设施读/写自定义类的对象。三种I/O类在各自独立的头文件中定义:iostream定义读/写控制窗口的类型,fstream定义读/写已命名文件的类型,而sstream所定义的类型则用于读/写存储在内存中的string对象。

类继承层次如图5.1所示。

C++的I/O类主要在iostream、fstream和sstream三个头文件中定义。iostream包括istream(从流中读取)、ostream(写到流中)及iostream(对流进行读/写)。fstream包括ifstream(从文件中读取,由istream派生而来)、ofstream(写到文件中,由ostream派生而来)及fstream(读/写文件,由iostream派生而来)。sstream包括istringstream(从string对象中读取,由istream派生而来)、ostringstream(写到string对象中,由ostream派生而来)及stringstream(对string对象进行读/写,由iostream派生而来)。所有的这些流类拥有几乎相同的接口,所以能够以统一的方式使用这些流类,不管操作的是文件、标准I/O、内存区还是string对象。下面分别对这三种流对象进行详细的介绍。图5.1简单的iostream继承层次5.2输入/输出流5.2.1庞大的I/O类库

C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios、istream、ostream、iostream、ifstream、ofstream、fstream、istrstream、ostrstream、strstream等,其中ios为根基类,其余都是它的直接或间接派生类。

ios直接派生四个类:输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase。输入文件流类同时继承了输入流类和文件流基类(当然对于根基类是间接继承);输出文件流类ofstream同时继承了输出流类和文件流基类;输入字符串流类istrstream同时继承了输入流类和字符串流基类;输出字符串流类ostrstream同时继承了输出流类和字符串流基类;输入/输出流类iostream同时继承了输入流类和输出流类;输入/输出文件流类fstream同时继承了输入/输出流类和文件流基类;输入/输出字符串流类strstream同时继承了输入/输出流类和字符串流基类。5.2.2预定义流对象cincin是istream流类的对象,它默认的输入是键盘,它在头文件iostream.h中作为全局对象定义:

istreamcin(stdin)//标准设备名作为其构造时的参数

istream流类对应每个基本数据类型都有友元,它们在iostream.h中声明:istream&operator>>(istream&dest,char*pSource);

istream&operator>>(istream&dest,intsource);

istream&operator>>(istream&dest,charsource);

//…

因此,如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:

#include<iostream>cin最常用的方法是使用右移运算符(>>),它是被重载以简化输入流的使用,即istream类从此运算符中获取输入。运算符>>被称为提取符。cin语句的一般格式为

cin>>变量1>>变量2>>…>>变量n;

例如,下面的代码将随后的三个数字输入并给变量x、y、z赋值:

#include<iostream.h>intx,y,z;cin>>x>>y>>z;

假设用户从键盘上输入了以下三个数:

123445

在这种情况下,程序将数12、34、45分别赋值给x、y、z。如同所有的istream实例,以这种方式输入的数字必须用一个或多个空白字符分隔,如空格符、制表符和换行符。

提取符按照目标对象的类型解析输入信息。如下所示:

inti;cin>>i;

floatf;cin>>f;charc;cin>>c;charbuf[32];cin>>buf;

所有的内置数据类型都重载了operator>>。读者自己也可以重载operator>>。大多数简单的C++ 程序使用cin来进行输入操作。有时需要对输入操作有更多要求,比如一次读入一行或每次读入一个字符,这时可以用I/O流成员函数。为了读取一行文本,可以使用getline成员函数,其函数原型为:

getline(char*line,intsize,char='\n');

第一个参数是字符数组,用于放置读取的文本,第二个参数是本次读取的最大字符个数,第三个参数是分隔字符,作为读取一行结束的标志。例如,下面的函数从键盘上读取一行文本:

charstr[256];cin.getline(str,sizeof(str));

在默认状态,getline成员函数读字符直到回车,或者读到指定的字符数。有时需要每次输入一个字符,这时就可以使用get()成员函数。其格式为:

charistream::get();

例如,下面的函数每次读入一个字符:

charletter:letter=cin.get();

使用流成员函数和提取符 >> 不只限于标准输入键盘,还可以是文件或字符流,在后面我们还会看到它的用法。5.2.3预定义流对象cout、cerr和clogcout是ostream流类的对象,它在头文件iostream.h中作为全局对象定义:

ostreamcout(stdout);//stdout是标准输出设备名

ostream流类对应每个基本数据类型都有友元,它们在iostream.h中声明:

ostream&operator<<(ostream&dest,char*pSource);ostream&operator<<(ostream&dest,intsource);ostream&operator<<(ostream&dest,charsource);

因此,如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:

#include<iostream>cout通常是和左移运算符(<<)一起使用的,即ostream对象向运算符发送输出。左移运算符又被称为插入符,它是被重载过了的。

cout语句的一般格式为

cout<<表达式1<<表达式2<<…<<表达式n;

例如,以下代码输出一个数a和一个字符串str,以及其他文字:

#include<iostream.h>inta=20;stringstr="thisisatest";//…cout<<"Thevalueofais"<<a<<endl;cout<<"Thestringis"<<str<endl;

除了标准输入/输出设备,还有标准错误设备cerr和clog,它们都是ostream类的一个实例。它们都和显示器相关联,通常等同于标准输出(cout)。和cout的区别是,尽管标准输出可被重定向为一个文件,而cerr和clog始终将信息在显示器上显示。cerr和clog的差别是,cerr流直接向显示器发送非缓冲的输出,而clog采用经缓冲的输出。clog和cerr都是显示错误信息的好办法,因为无论标准输出是否被重定向,它们都向屏幕显示。例如,以下代码向显示器发送一条出错信息:

cerr<<"Youenterthewrongnumber";cerr<<error_number<<endl;

下面举一个完整的例子来说明上述几个流对象的用法。

#include<iostream>usingnamespacestd;intmain(){ inti,j;

cout<<"Pleaseinputanumber."<<endl; cin>>i; cout<<"Pleaseinputanothernumber."<<endl; cin>>j;cout<<"i="<<i<<endl; cout<<"j="<<j<<endl; cout<<"i+j="<<i+j<<endl;

if(j==0) cerr<<"thejiszero,cannotbedivided."<<endl; else cout<<"i/j="<<i/j<<endl;

return0;}

从键盘输入两个数,求它们的和并输出,然后判断第二个数是否为零,如果为零则不能相除,否则就输出它们的商。5.3输入/输出的格式控制上节介绍的是使用cout和cin时的默认格式。但有时人们在输入/输出时有格式要求,如在输出时规定字段宽度,保留小数的位数,数据向左或向右对齐等。C++有两种方法控制格式的输出,一种是使用流对象的成员函数,另一种是使用格式控制符,下面分别介绍。5.3.1ios类中的枚举常量在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,因此其中的每个枚举类型常量在加上ios:: 前缀后都可以为本类成员函数和所有外部函数访问。在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入/输出格式的标志使用的。该枚举类型定义如下:

enum{skipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio};

各枚举常量的含义如下:

skipws:利用它设置对应标志后,从流中输入数据时跳过当前位置及后面的所有连续的空白字符,从第一个非空白字符起读数,否则不跳过空白字符。空格、制表符'\t'、回车符'\r'和换行符 '\n' 统称为空白符。left,right,internal:left在指定的域宽内按左对齐输出,right按右对齐输出,而internal使数值的符号按左对齐、数值本身按右对齐输出。域宽内剩余的字符位置用填充符填充。缺省为right设置。在任一时刻只有一种有效。

dec,oct,hex:设置dec对应标志后,使以后的数值按十进制输出,设置oct后按八进制输出,而设置hex后则按十六进制输出。缺省为dec设置。

showbase:设置对应标志后使数值输出的前面加上基指示符,八进制数的基指示符为数字0,十六进制数的基指示符为0x,十进制数没有基指示符。缺省为不设置,即在数值输出的前面不加基指示符。showpoint:强制输出的浮点数中带有小数点和小数尾部的无效数字0。缺省为不设置。

uppercase:使输出的十六进制数和浮点数中使用的字母为大写。缺省为不设置,即输出的十六进制数和浮点数中使用的字母为小写。

showpos:使输出的正数前带有正号“+”。缺省为不设置,即输出的正数前不带任何符号。

scientific,fixed:进行scientific设置后使浮点数按科学表示法输出,进行fixed设置后使浮点数按定点表示法输出。只能任设其一。缺省时由系统根据输出的数值选用合适的表示输出。unitbuf,stdio:这两个常量很少使用,所以不予介绍。在ios中定义的第二个枚举类型为:

enumopen_mode{in,out,ate,app,trunc,nocreate,noreplace,binany};

其中的每个枚举常量规定一种文件打开的方式,在定义文件流对象和打开文件时使用。在ios中定义的第三个枚举类型为:

enumseek_dir{beg,cur,end};

其中的每个枚举常量用于对文件指针的定位操作上。5.3.2ios类中的成员函数

ios类提供成员函数对流的状态进行检测和进行输入/输出格式控制等操作,每个成员函数的声明格式和简要说明如下:

intbad();操作出错时返回非0值。

inteof();读取到流中最后的文件结束符时返回非0值。

intfail();操作失败时返回非0值。

voidclear();清除bad、eof和fail所对应的标志状态,使之恢复为正常状态值0,使good标志状态恢复为1。

charfill();返回当前使用的填充字符。

charfill(charc);重新设置流中用于输出数据的填充字符为c的值,返回此前的填充字符。系统预设置填充字符为空格。longflags();返回当前用于I/O控制的格式状态字。

longflags(longf);重新设置格式状态字为f的值,返回此前的格式状态字。

intgood();操作正常时返回非0值,当操作出错、失败和读到文件结束符时均为不正常,则返回0。

intprecision();返回浮点数输出精度,即输出的有效数字的位数。

intprecision(intn);设置浮点数的输出精度为n,返回此前的输出精度。系统预设置的输出精度为6,即输出的浮点数最多具有6位有效数字。

intrdstate();操作正常时返回0,否则返回非0值,它与good()正好相反。longsetf(longf);根据参数f设置相应的格式化标志,返回此前的设置。参数f所对应的实参为无名枚举类型中的枚举常量(又称格式化常量),可以同时使用一个或多个常量,每两个常量之间要用按位或操作符连接。如当需要左对齐输出,并使数值中的字母大写时,则调用该函数的实参为ios::left|ios::uppercase。

longunsetf(longf);根据参数f清除相应的格式化标志,返回此前的设置。如要清除此前的左对齐输出设置,恢复缺省的右对齐输出设置,则调用该函数的实参为ios::left。

intwidth();返回当前的输出域宽。若返回数值0,则表明没有为刚才输出的数值设置输出域宽,输出域宽是指输出的值在流中所占有的字节数。intwidth(intw);设置下一个数据值的输出域宽为w,返回为输出上一个数据值所规定的域宽,若无规定则返回0。注意:此设置不是一直有效,而只是对下一个输出数据有效。因为所有I/O流类都是ios的派生类,所以它们的对象都可以调用ios类中的成员函数和使用ios类中的格式化常量进行输入/输出格式控制。下面以标准输出流对象cout为例说明输出的格式化控制。

【程序5.1】#include<iostream.h>//usingnamespacestd;intmain(){intx=50,y=500,z=2048;cout<<x<<''<<y<<''<<z<<endl; //按十进制输出

cout.setf(ios::oct); //设置为八进制输出

cout<<x<<''<<y<<''<<z<<endl; //按八进制输出

cout.unsetf(ios::oct); //取消八进制输出设置,恢复按十进制输出

cout.setf(ios::hex); //设置为十六进制输出cout<<x<<''<<y<<''<<z<<endl; //按十六进制输出

cout.setf(ios::showbase|ios::uppercase);//设置基指示符输出和数值中的字母大写输出

cout<<x<<''<<y<<''<<z<<endl;cout.unsetf(ios::showbase|ios::uppercase);//取消基指示符输出和数值中的字母大写输出

cout<<x<<''<<y<<''<<z<<endl;cout.unsetf(ios::hex);//取消十六进制输出设置,恢复按十进制输出

cout<<x<<''<<y<<''<<z<<endl;return0;}

运行结果如下:【程序5.2】#include<iostream>usingnamespacestd;intmain(){intx=564;doubley=-6.635163;cout<<"x=";cout.width(10); //设置输出下一个数据的域宽为10cout<<x; //按缺省的右对齐输出,剩余位置填充空格字符

cout<<"y=";cout.width(10); //设置输出下一个数据的域宽为10cout<<y<<endl;cout.setf(ios::left); //设置按左对齐输出

cout<<"x=";cout.width(10);cout<<x;cout<<"y=";cout.width(10);cout<<y<<endl;cout.fill('*'); //设置填充字符为'*'cout.precision(3); //设置浮点数输出精度为3cout.setf(ios::showpos); //设置正数的正号输出

cout<<"x=";cout.width(10);cout<<x;cout<<"y=";cout.width(10);cout<<y<<endl;return0;}

运行结果如下:【程序5.3】#include<iostream>usingnamespacestd;intmain(){floatx=87,y=-6.298;cout<<x<<''<<y<<endl;cout.setf(ios::showpoint); //强制显示小数点和无效0cout<<x<<''<<y<<endl;cout.unsetf(ios::showpoint);//恢复缺省输出

cout.setf(ios::scientific); //设置按科学表示法输出cout<<x<<''<<y<<endl;cout.setf(ios::fixed); //设置按定点表示法输出

cout<<x<<''<<y<<endl;return0;}

运行结果如下:5.3.3格式控制操作符数据输入/输出的格式控制还有更简便的形式,即使用系统头文件iomanip.h中提供的操作符。使用这些操作符不需要调用成员函数,只要把它们作为插入操作符<<(个别作为提取操作符>>)的输出对象即可。需要注意的是,如果使用了操作符,在程序单位的开头除了要加头文件iostream外,还要加头文件iomanip。这些操作符及功能如下:

dec:转换为按十进制输出整数,它也是系统预置的进制。

oct:转换为按八进制输出整数。

hex:转换为按十六进制输出整数。

ws:从输入流中读取空白字符。endl:输出换行符 '\n' 并刷新流。刷新流是指把流缓冲区的内容立即写入到对应的物理设备上。

ends:输出一个空字符 '\0'。

flush:只刷新一个输出流。

setiosflags(longf):设置f所对应的格式化标志,功能与成员函数setf(longf)相同,当然输出该操作符后返回的是一个输出流。如果采用标准输出流cout输出它,则返回cout。对于输出每个操作符后也都是如此,即返回输出它的流,以便向流中继续插入下一个数据。

resetiosflags(longf):清除f所对应的格式化标志,功能与成员函数unsetf(longf)相同。当然输出后返回一个流。setfill(intc):设置填充字符为ASCII码值为c的字符。

setprecision(intn):设置浮点数的输出精度为n。

setw(intw):设置下一个数据的输出域宽为w。在上面的操作符中,dec、oce、hex、endl、ends、flush和ws除了在iomanip.h中有定义外,在iostream.h中也有定义。所以当程序或编译单元中只需要使用这些不带参数的操作符时,可以只包含iostream.h文件,而不需要包含iomanip.h文件。下面以标准输出流对象cout为例,说明使用操作符进行的输出格式化控制。【程序5.4】#include<iostream>//因iomanip.h中包含有iostream.h,所以该命令可省略

#include<iomanip>usingnamespacestd;intmain(){intx=50,y=500,z=2048;cout<<x<<''<<y<<''<<z<<endl; //按十进制输出

cout<<oct<<x<<''<<y<<''<<z<<endl; //按八进制输出cout<<hex<<x<<''<<y<<''<<z<<endl; //按十六进制输出

cout<<setiosflags(ios::showbase|ios::uppercase);//设置基指示符和数值中的字母大写输出

cout<<x<<''<<y<<''<<z<<endl; //仍按十六进制输出

cout<<resetiosflags(ios::showbase|ios::uppercase);//取消基指示符和数值中的字母大写输出

cout<<x<<''<<y<<''<<z<<endl; //仍按十六进制输出

cout<<dec<<x<<''<<y<<''<<z<<endl;//按十进制输出

return0;}

此程序的功能和运行结果都与程序5.1完全相同。【程序5.5】#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intx=564;doubley=-6.635163;cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<setiosflags(ios::left); //设置按左对齐输出

cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<setfill('*'); //设置填充字符为'*'cout<<setprecision(3); //设置浮点数输出精度为3cout<<setiosflags(ios::showpos); //设置正数的正号输出

cout<<"x="<<setw(10)<<x;cout<<"y="<<setw(10)<<y<<endl;cout<<resetiosflags(ios::left|ios::showpos);cout<<setfill('');return0;}

此程序的功能和运行结果完全与程序5.2相同。【程序5.6】#include<iostream>#include<iomanip>usingnamespacestd;intmain(){floatx=87,y=-6.298;cout<<x<<''<<y<<endl;cout<<setiosflags(ios::showpoint);cout<<x<<''<<y<<endl;cout<<resetiosflags(ios::showpoint);cout<<setiosflags(ios::scientific);cout<<x<<''<<y<<endl;cout<<setiosflags(ios::fixed);cout<<x<<''<<y<<endl;return0;}

此程序的功能和运行结果完全与程序5.3相同。5.4文件操作对编程来说,文件也是一个很重要的概念,因为计算机的内存是一个易失存储器,当断电时保存在它里面的数据就会丢失。为了要长久地保存一些数据,就需要磁盘,而磁盘上的数据通常都是以文件的形式存在的,我们运行的程序也是保存在磁盘上以文件的形式存在的。下面介绍怎样从文件读数据或向文件写数据。5.4.1文件的概念文件是由文件名标识的一组有序数据的集合,通常存放在磁盘上。文件名由字母数字序列组成,且长度有一定限制,如file1.txt、main.cpp。文件有很多种格式,比如文本文件、图形文件、音频文件、视频文件等。5.4.2文件的打开与关闭 文件流类有ofstream、ifstream和fstream,它们在fstream.h中定义。其中,fstream是ofstream和ifstream多重继承的子类。文件流类定义的操作应用于外部设备,最典型的设备是磁盘文件。要定义一个文件流类对象,须规定文件名和打开方式。类ofstream用于执行文件输出,其形式如下:

ofstream::ofstream(char*pFileName,intmode=ios::out,intprot=filebuf::openprot);第一个参数指向要打开的文件名,第二个参数指定文件的打开方式,第三个参数指定文件的保护方式。mode的选项如表5.1所示。

prot是文件保护方式,它的选项如表5.2所示。表5.1文件打开选项表5.2文件保护方式选项

需要读写文件时,首先必须定义自己的对象,并将它绑定在需要的文件上。打开文件通常有两种方式,第一种是直接将文件名传给文件流对象的构造函数。假设infilename和outfilename是希望读/写的文件名的string对象,则编码如下:

ifstreamreadFromFile(infilename.c_str());ofstreamwriteToFile(outfilename.c_str());

因为I/O流只接受字符数组的文件名,而不接受string对象的文件名,故需要转换。第二种是先定义文件流对象,并没有捆绑具体的文件。在使用fstream对象之前,还必须使这些对象捆绑要读/写的文件。如下所示:

ifstreaminfile;ofstreamoutfile;infile.open("in.txt");outfile.open(out.cpp);

调用open成员函数将已存在的fstream对象与特定文件绑定。为了实现读/写,需要将指定的文件打开并定位,open函数完成系统指定的所有需要的操作。在实际编程中,打开文件后,要做的第一件事就是检查打开是否成功:

if(!infile){cerr<<"error:unabletoopeninputfile:"<<infile<<endl;return-1;}

如果打开(open)失败,则说明fstream对象还没有为I/O做好准备,当测试对象返回true时意味着文件已经可以使用。当用文件流打开一文件时,就保持和该文件关联。如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件:

ifstreaminputfile("infile.txt");inputfile.close();inputfile.open("nfile.txt");

这样当文件流断开与一个文件的关联时,就可以和另一个文件建立关联。若以二进制打开文件则必须显式指明,如下所示:

ifstreaminfile("ifile.dat",ios::in|ios::binary);5.4.3字符文件的访问操作

C++的文件输入/输出流在缺省状态下打开时为文本模式,例如:

#include<fstream>ifstreaminfile("D:\\a.txt");ofstreamoutfile("D:\\b.txt");

都是以文本的模式打开输入流和输出流。下面的例子从指定的文本文件读取数据并显示在屏幕上,在每行前面加上行号。

#include<iostream>#include<fstream>usingnamespacestd;intmain(){ chars[100]; cout<<"Enterthenameofthefile:"<<endl; cin>>s; ifstreamfin(s,ios:in|ios::nocreate); if(!fin) { cout<<"Filecouldnotbeopened."<<endl; return1; }intn=1;

while(!fin.eof()) { fin.getline(s,100); cout<<n<<":"<<s<<endl; n++; } return0;}5.5字符串流

iostream标准库支持内存中的输入/输出,只要将流与存储在程序内存中的string对象关联起来即可。此时,就可以使用iostream输入/输出操作符读写这个string对象。串流类在strstream.h中定义,其中定义了ostream、istream和strstream三个串流类。其中,strstream是ostrstream和istrstream多重继承的子类。要定义串流类对象,必须提供字符数组和数组大小。类istrstream用于执行串流输入。例如,下面的代码定义一个串流类对象,并对其进行输入操作:

charstr[30]="Whatdoyoulike?\n";charc[6];istrstreamiss(str);iss>>c;cout<<c<<endl;

输出结果为:

What

类ostrstream用于执行串流输出,如程序5.7所示。

【程序5.7】#include<iostream>#include<strstream>usingnamespacestd;intmain(){char*str="9054450.54";istrstreamiss(str,0);intnum;floatbalance;iss>>num>>balance; //从串流中读入一个整数和浮点数

char*pBuf=newchar[64]; memset(pBuf,0,sizeof(char)*64);ostrstreamoss(pBuf,64);oss<<"Thenumberis:"<<num;oss<<",thebalanceis:"<<balance;cout<<pBuf<<endl;delete[]pBuf;return0;}

运行结果如下:

下例是读入一个文件,并统计它的单词数。

#include<iostream>#include<strstream>#include<string>

温馨提示

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

评论

0/150

提交评论