} } }

    C++ Iostreams 用法详解(一)整体把握

    添加时间:2013-5-10 点击量:

    小我感觉C++的iostream用起来是很是便利的,只须要应用简单的<<和>>运算符就可以便利的进行各类类型的数据的格局化输入输出。并且C++中的iostream在编译阶段完成输入输出的格局化解析的,比C中的printf()和scanf()在运行时格局化解析要加倍安然和强大。在这个系列中我就来具体的介绍一下C++中各类输入输出流的用法。


    起首来大致懂得一下C++中的iostreams,我们用到的所有的相干的内容都邑定义鄙人面的这些头文件里:



    <fstream>    <iomanip>
    <ios>    <iosfwd>
    <iostream>    <istream>
    <ostream>    <sstream>
    <streambuf>    <strstream>




    这此中我们用到最多的可能就是<iostream>,毕竟?成果几乎任何C++的教程都邑以这个根蒂根基。当然这个头文件里面还有一些我们可能没有效到过的全局对象,在这里也全部列出来:



    cerr        Specifies the cerr global stream.           
    cin         Specifies the cin global stream.           
    clog       Specifies the clog global stream.           
    cout       Specifies the cout global stream.           
    wcerr     Specifies the wcerr global stream.           
    wcin      Specifies the wcin global stream.
    wclog    Specifies the wclog global stream.
    wcout    Specifies the wcout global stream.           




    这些都是全局的对象,在包含了<iostream>之后我们就可以直接应用这些对象。至于怎么应用这些对象就不说了。


    因为我们在头文件中经常只写一些声明,而不喜好在头文件中去引用全局对象,因为如许会涉及到对象的初始化题目,这是个斗劲错杂的题目,荣幸的是,C++的iostreams的设计者以一套很是完美的办法来解决了这个题目,根蒂根基上我们可以在须要的时辰(例如在头文件中声明重载<<运算符的函数)在头文件中随便率性的去include这些库头文件而不会呈现题目。然则其实C++标准库已经为我们供给了一个更为规范的头文件,向前引用声明(Declare forward references)头文件<iosfwd>。在这个头文件中只有一些声明,并不包含定义,须要在头文件中向前引用申明的时辰,就可以包含这个头文件。查看这个头文件的内容也可以让我们清楚的懂得到各类类的原型,这个头文件中的项目组内容如下:


    类型声明:



    typedef T1 streamoff;

    typedef T2 streamsize;

    typedef fpos streampos;

     

    // wchar_t TYPE DEFINITI

    typedef basic_ios<char, char_traits<char> > ios;

    typedef basic_streambuf<char, char_traits<char> > streambuf;

    typedef basic_istream<char, char_traits<char> > istream;

    typedef basic_ostream<char, char_traits<char> > ostream;

    typedef basic_iostream<char, char_traits<char> > iostream;

    typedef basic_stringbuf<char, char_traits<char> > stringbuf;

    typedef basic_istringstream<char, char_traits<char> > istringstream;

    typedef basic_ostringstream<char, char_traits<char> > ostringstream;

    typedef basic_stringstream<char, char_traits<char> > stringstream;

    typedef basic_filebuf<char, char_traits<char> > filebuf;

    typedef basic_ifstream<char, char_traits<char> > ifstream;

    typedef basic_ofstream<char, char_traits<char> > ofstream;

    typedef basic_fstream<char, char_traits<char> > fstream;

     

    // wchar_t TYPE DEFINITI

    typedef basic_ios<wchar_t, char_traits<wchar_t> > wios;

    typedef basic_streambuf<wchar_t, char_traits<wchar_t> > wstreambuf;

    typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;

    typedef basic_ostream<wchar_t, char_traits<wchar_t> > wostream;

    typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;

    typedef basic_stringbuf<wchar_t, char_traits<wchar_t> > wstringbuf;

    typedef basic_istringstream<wchar_t, char_traits<wchar_t> > wistringstream;

    typedef basic_ostringstream<wchar_t, char_traits<wchar_t> > wostringstream;

    typedef basic_stringstream<wchar_t, char_traits<wchar_t> > wstringstream;

    typedef basic_filebuf<wchar_t, char_traits<wchar_t> > wfilebuf;

    typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;

    typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;

    typedef basic_fstream<wchar_t, char_traits<wchar_t> > wfstream;




    模板类的向前申明:



    template<class _Statetype>

    class fpos;

     

    template<class Elem>;

    class char_traits;

     

    class char_traits<char>;

     

    class char_traits<wchar_t>;

     

    template<class _Ty>

    class allocator;

     

    class ios_base;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_ios;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class istreambuf_iterator;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class ostreambuf_iterator;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_streambuf;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_istream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_ostream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_iostream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_stringbuf;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_istringstream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_ostringstream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_stringstream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_filebuf;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_ifstream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_ofstream;

     

    template<class Elem, class Tr = char_traits<Elem> >

    class basic_fstream;




    如许我们就知道了本来我们一向在应用的这些类型都是一些模板类啊,是的,恰是应用的C++的模板类这一机制才使得了iostreams能很好的支撑wchar_t类型(Unicode),是须要在我们应用的时辰在类型的前面加上一个w就ok了,就像支撑宽字符的字符串类型wstring。如许的设计思路是值得我们进修的,C++中还有很多类似的器材,只有效如许类似的设计办法你才干说你C++还不错了。


    我在这里并不合错误这里的一些我们没见过的类型做具体的解析了,因为有些器材我们根蒂根基是用不到的,而在这个系列我也只讲一些斗劲常用的C++ Iostreams的用法,所以大师也不消太具体的去看上方的器材了。


    可以看到我们常用的类型有:istream, ostream, ifstream, ofstream, istringstream, ostringstream, streambuf.(当然前面加w的,因为是模板类,所以其用啊都雷同啦)


    本系列将从以上这些类型来具体讲解C++ 标准库中iostreams的用法,本人也是新手,大项目组内容会参考MSDN,有什么错的处所或者不完美的处所大师辅佐指出。

    读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
    分享到: