📄 c++的iostream标准库介绍.htm
字号:
{
cout<<"<FONT color=blue>文件读错误</FONT>";
system("<FONT color=blue>pause</FONT>");
exit(1);
}
<FONT color=brown>char</FONT> ch;
string content;
<FONT color=brown>while</FONT>(myfile.get(ch))
{
content+=ch;
cout.put(ch);<FONT color=green>//cout<<ch;这么写也是可以的 </FONT>
}
myfile.close();
cout<<content;
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 上例中,我们利用成员函数get(),逐一的读取文件中的有效字符,再利用put()成员函数,将文件中的数据通过循环逐一输出到标准设备(屏幕)上,
get()成员函数会在文件读到默尾的时候返回假值,所以我们可以利用它的这个特性作为while循环的终止条件,我们同时也在上例中引入了C++风格的字符串类型string,在循环读取的时候逐一保存到content中,要使用string类型,必须包含string.h的头文件。
<P>
<P>我们在简单介绍过ofstream类和ifstream类后,我们再来看一下fstream类,fstream类是由iostream派生而来,fstream类对象可以同对文件进行读写操作。
<P> 示例代码如下:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=navy>#include</FONT> <fstream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
fstream myfile;
myfile.open("<FONT color=blue>c:\\1.txt</FONT>",ios::out|ios::app,0);
<FONT color=brown>if</FONT>(!myfile)
{
cout<<"<FONT color=blue>文件写错误,文件属性可能为只读!</FONT>"<<endl;
system("<FONT color=blue>pause</FONT>");
exit(1);
}
myfile<<"<FONT color=blue>中国软件开发实验室</FONT>"<<endl<<"<FONT color=blue>网址:</FONT>"<<"<FONT color=blue>www.cndev-lab.com</FONT>"<<endl;
myfile.close();
myfile.open("<FONT color=blue>c:\\1.txt</FONT>",ios::in,0);
<FONT color=brown>if</FONT>(!myfile)
{
cout<<"<FONT color=blue>文件读错误,文件可能丢失!</FONT>"<<endl;
system("<FONT color=blue>pause</FONT>");
exit(1);
}
<FONT color=brown>char</FONT> ch;
<FONT color=brown>while</FONT>(myfile.get(ch))
{
cout.put(ch);
}
myfile.close();
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 由于fstream类可以对文件同时进行读写操作,所以对它的对象进行初始话的时候一定要显式的指定mode和openprot参数。
<P> 接下来我们来学习一下串流类的基础知识,什么叫串流类?
<H3><A name="3 strstream: ostrstream 和 istrs"></A>3 strstream: ostrstream 和
istrstream
</H3> 简单的理解就是能够控制字符串类型对象进行输入输出的类,C++不光可以支持C++风格的字符串流控制,还可以支持C风格的字符串流控制。
<P> 我们先看看看C++是如何对C风格的字符串流进行控制的,C中的字符串其实也就是字符数组,字符数组内的数据在内存中的位置的排列是连续的,我们通常用
char str[size]或者char
*str的方式声明创建C风格字符数组,为了能让字符数组作为设备并提供输入输出操作,C++引入了ostrstream、istrstream、
strstream这三个类,要使用他们创建对象就必须包含strstream.h头文件。
<UL>
<LI>istrstream类用于执行C风格的串流的输入操作,也就是以字符串数组作为输入设备。
<LI>ostrstream类用于执行C风格的串流的输出操作,也就是一字符串数组作为输出设备。
<LI>strstream类同时可以支持C风格的串流的输入输出操作。 </LI></UL>
<P> istrstream类是从istream(输入流类)和strstreambase(字符串流基类)派生而来,ostrstream是从
ostream(输出流类)和strstreambase(字符串流基类)派生而来,strstream则是从iostream(输入输出流类)和和
strstreambase(字符串流基类)派生而来。
<P> 他们的继承关系如下图所示:<BR><IMG src="C++的iostream标准库介绍.files/05cppios05.gif">
<P> 串流同样不是标准设备,不会有预先定义好的全局对象,所以不能直接操作,需要通过构造函数创建对象。
<P>类istrstream的构造函数原形如下:
<DIV class=fragment><PRE> istrstream::istrstream(<FONT color=brown>const</FONT> <FONT color=brown>char</FONT> *str,<FONT color=brown>int</FONT> size);</PRE><PRE></PRE></DIV> 参数1表示字符串数组,而参数2表示数组大小,当size为0时,表示istrstream类对象直接连接到由str所指向的内存空间并以\0结尾的字符串。
<P> 下面的示例代码就是利用istrstream类创建类对象,制定流输入设备为字符串数组,通过它向一个字符型对象输入数据。代码如下:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=navy>#include</FONT> <strstream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
<FONT color=brown>char</FONT> *name = "<FONT color=blue>www.cndev-lab.com</FONT>";
<FONT color=brown>int</FONT> arraysize = strlen(name)+1;
istrstream is(name,arraysize);
<FONT color=brown>char</FONT> temp;
is>>temp;
cout<<temp;
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 类ostrstream用于执行串流的输出,它的构造函数如下所示:
<DIV class=fragment><PRE> ostrstream::ostrstream(<FONT color=brown>char</FONT> *_Ptr,<FONT color=brown>int</FONT> streamsize,<FONT color=brown>int</FONT> Mode = ios::out);</PRE><PRE></PRE></DIV> 第一个参数是字符数组,第二个是说明数组的大小,第三个参数是指打开方式。
<P> 我们来一个示例代码:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=navy>#include</FONT> <strstream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
<FONT color=brown>int</FONT> arraysize=1;
<FONT color=brown>char</FONT> *pbuffer=<FONT color=brown>new</FONT> <FONT color=brown>char</FONT>[arraysize];
ostrstream ostr(pbuffer,arraysize,ios::out);
ostr<<arraysize<<ends;<FONT color=green>//使用ostrstream输出到流对象的时候,要用ends结束字符串 </FONT>
cout<<pbuffer;
<FONT color=brown>delete</FONT>[] pbuffer;
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 上面的代码中,我们创建一个c风格的串流输出对象ostr,我们将arraysize内的数据成功的以字符串的形式输出到了ostr对象所指向的pbuffer指针的堆空间中,pbuffer也正是我们要输出的字符串数组,在结尾要使用ends结束字符串,如果不这么做就有溢出的危险。
<H3><A name="4 stringstream"></A>4 stringstream
</H3>对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。 stringstream的构造函数原形如下:
<DIV class=fragment><PRE> stringstream::stringstream(string str);</PRE><PRE></PRE></DIV> 示例代码如下:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=navy>#include</FONT> <sstream>
<FONT color=navy>#include</FONT> <string>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
stringstream ostr("<FONT color=blue>ccc</FONT>");
ostr.put('d');
ostr.put('e');
ostr<<"<FONT color=blue>fg</FONT>";
string gstr = ostr.str();
cout<<gstr<<endl;
<FONT color=brown>char</FONT> a;
ostr>>a;
cout<<a
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。示例代码如下:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=navy>#include</FONT> <sstream>
<FONT color=navy>#include</FONT> <string>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
stringstream sstr;
<FONT color=green>//--------int转string----------- </FONT>
<FONT color=brown>int</FONT> a=100;
string str;
sstr<<a;
sstr>>str;
cout<<str<<endl;
<FONT color=green>//--------string转char[]-------- </FONT>
sstr.clear();<FONT color=green>//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。 </FONT>
string name = "<FONT color=blue>colinguan</FONT>";
<FONT color=brown>char</FONT> cname[200];
sstr<<name;
sstr>>cname;
cout<<cname;
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 接下来我们来学习一下输入/输出的状态标志的相关知识.
<H3><A name="5 io_state 输入/输出的状态标志"></A>5 io_state 输入/输出的状态标志
</H3>C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
<UL>
<LI>goodbit 无错误
<LI>Eofbit 已到达文件尾
<LI>failbit 非致命的输入/输出错误,可挽回
<LI>badbit 致命的输入/输出错误,无法挽回 </LI></UL>
<P>有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.下例示例,表示出了rdstate()的用法:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
<FONT color=brown>int</FONT> a;
cin>>a;
cout<<cin.rdstate()<<endl;
<FONT color=brown>if</FONT>(cin.rdstate() == ios::goodbit)
{
cout<<"<FONT color=blue>输入数据的类型正确,无错误!</FONT>"<<endl;
}
<FONT color=brown>if</FONT>(cin.rdstate() == ios_base::failbit)
{
cout<<"<FONT color=blue>输入数据类型错误,非致命错误,可清除输入缓冲区挽回!</FONT>"<<endl;
}
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:
<DIV class=fragment><PRE><FONT color=brown>bool</FONT> bad();
<FONT color=brown>bool</FONT> eof();
<FONT color=brown>bool</FONT> fail();
<FONT color=brown>bool</FONT> good();</PRE><PRE></PRE></DIV>
<P> 下例示例,表示出了上面各成员函数的用法:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
{
<FONT color=brown>int</FONT> a;
cin>>a;
cout<<cin.rdstate()<<endl;
<FONT color=brown>if</FONT>(cin.good())
{
cout<<"<FONT color=blue>输入数据的类型正确,无错误!</FONT>"<<endl;
}
<FONT color=brown>if</FONT>(cin.fail())
{
cout<<"<FONT color=blue>输入数据类型错误,非致命错误,可清除输入缓冲区挽回!</FONT>"<<endl;
}
system("<FONT color=blue>pause</FONT>");
}</PRE><PRE></PRE></DIV> 如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。
<P> 示例代码如下:
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> <iostream>
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std;
<FONT color=brown>int</FONT> main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -