程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Iostreams 用法詳解(一)整體把握

C++ Iostreams 用法詳解(一)整體把握

編輯:C++入門知識

個人覺得C++的iostream用起來是非常方便的,只需要使用簡單的<<和>>運算符就可以方便的進行各種類型的數據的格式化輸入輸出。而且C++中的iostream在編譯階段完成輸入輸出的格式化解析的,比C中的printf()和scanf()在運行時格式化解析要更加安全和強大。在這個系列中我就來詳細的介紹一下C++中各種輸入輸出流的用法。

首先來大致了解一下C++中的iostreams,我們用到的所有的相關的內容都會定義在下面的這些頭文件裡:

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

這其中我們用到最多的可能就是<iostream>,畢竟幾乎任何C++的教程都會以這個基礎。當然這個頭文件裡面還有一些我們可能沒有用到過的全局對象,在這裡也全部列出來:

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 DEFINITIONS
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 DEFINITIONS
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,有什麼錯的地方或者不完善的地方希望大家幫忙指出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved