⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c++的iostream标准库介绍.htm

📁 C++的iostream标准库介绍。 希望能帮助你。
💻 HTM
📖 第 1 页 / 共 4 页
字号:
        { 
                cout&lt;&lt;"<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&lt;&lt;ch;这么写也是可以的 </FONT>
        } 
        myfile.close(); 
        cout&lt;&lt;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> &lt;iostream&gt; 
<FONT color=navy>#include</FONT> &lt;fstream&gt; 
<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&lt;&lt;"<FONT color=blue>文件写错误,文件属性可能为只读!</FONT>"&lt;&lt;endl; 
                system("<FONT color=blue>pause</FONT>"); 
                exit(1); 
        } 
        myfile&lt;&lt;"<FONT color=blue>中国软件开发实验室</FONT>"&lt;&lt;endl&lt;&lt;"<FONT color=blue>网址:</FONT>"&lt;&lt;"<FONT color=blue>www.cndev-lab.com</FONT>"&lt;&lt;endl;   
        myfile.close(); 
        
        myfile.open("<FONT color=blue>c:\\1.txt</FONT>",ios::in,0); 
        <FONT color=brown>if</FONT>(!myfile) 
        { 
                cout&lt;&lt;"<FONT color=blue>文件读错误,文件可能丢失!</FONT>"&lt;&lt;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> &lt;iostream&gt; 
<FONT color=navy>#include</FONT> &lt;strstream&gt; 
<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&gt;&gt;temp; 
        cout&lt;&lt;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> &lt;iostream&gt; 
<FONT color=navy>#include</FONT> &lt;strstream&gt; 
<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&lt;&lt;arraysize&lt;&lt;ends;<FONT color=green>//使用ostrstream输出到流对象的时候,要用ends结束字符串 </FONT>
        cout&lt;&lt;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> &lt;iostream&gt; 
<FONT color=navy>#include</FONT> &lt;sstream&gt; 
<FONT color=navy>#include</FONT> &lt;string&gt; 
<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&lt;&lt;"<FONT color=blue>fg</FONT>"; 
        string gstr = ostr.str(); 
        cout&lt;&lt;gstr&lt;&lt;endl; 
        
        <FONT color=brown>char</FONT> a; 
        ostr&gt;&gt;a; 
        cout&lt;&lt;a 
        
        system("<FONT color=blue>pause</FONT>"); 
}</PRE><PRE></PRE></DIV>  除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。示例代码如下: 
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> &lt;iostream&gt; 
<FONT color=navy>#include</FONT> &lt;sstream&gt; 
<FONT color=navy>#include</FONT> &lt;string&gt; 
<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&lt;&lt;a; 
        sstr&gt;&gt;str; 
        cout&lt;&lt;str&lt;&lt;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&lt;&lt;name; 
        sstr&gt;&gt;cname; 
        cout&lt;&lt;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> &lt;iostream&gt; 
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std; 

<FONT color=brown>int</FONT> main()  
{ 
        <FONT color=brown>int</FONT> a; 
        cin&gt;&gt;a; 
        cout&lt;&lt;cin.rdstate()&lt;&lt;endl; 
        <FONT color=brown>if</FONT>(cin.rdstate() == ios::goodbit) 
        { 
                cout&lt;&lt;"<FONT color=blue>输入数据的类型正确,无错误!</FONT>"&lt;&lt;endl; 
        } 
        <FONT color=brown>if</FONT>(cin.rdstate() == ios_base::failbit) 
        { 
                cout&lt;&lt;"<FONT color=blue>输入数据类型错误,非致命错误,可清除输入缓冲区挽回!</FONT>"&lt;&lt;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> &lt;iostream&gt; 
<FONT color=brown>using</FONT> <FONT color=brown>namespace</FONT> std; 

<FONT color=brown>int</FONT> main()  
{ 
        <FONT color=brown>int</FONT> a; 
        cin&gt;&gt;a; 
        cout&lt;&lt;cin.rdstate()&lt;&lt;endl; 
        <FONT color=brown>if</FONT>(cin.good()) 
        { 
                cout&lt;&lt;"<FONT color=blue>输入数据的类型正确,无错误!</FONT>"&lt;&lt;endl; 
        } 
        <FONT color=brown>if</FONT>(cin.fail()) 
        { 
                cout&lt;&lt;"<FONT color=blue>输入数据类型错误,非致命错误,可清除输入缓冲区挽回!</FONT>"&lt;&lt;endl; 
        } 
        system("<FONT color=blue>pause</FONT>"); 
}</PRE><PRE></PRE></DIV>  如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。 

<P>  示例代码如下: 
<DIV class=fragment><PRE><FONT color=navy>#include</FONT> &lt;iostream&gt; 
<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 + -