ostream類方法


概要:

  • ios_base類表示流的一般特征,如是否可讀取、是二進制流還是文本流等;
  • ios類基於ios_base,其中包括了一個指向streambuf對象的指針成員;
  • streambuf類為緩中區提供了內存,並提供用於填充緩沖區、訪問緩沖區內容、刷新緩沖區和管理緩沖區內存的類方法;
  • ostream 類是從ios 類派生而來的,提供了輸出方法;
  • istream類也是從ios類派生而來的,提供了輸入方法;
  • iostream類是基於istream和ostream類的,因此繼承了輸入方法和輸出方法。

  1.ostream類的類方法

  • 重載的<<運算符

  ostream類重新定義了<<運算符,方法是將其重載為輸出。在這種情況下,<<叫做插入運算符,插入運算符被重載,使之能夠識別c++中所有的基本類型。

  原型:ostream & operator<<(Type);

  函數返回一個指向ostream對象的引用,這使得可以將輸出連接起來。

  • put()方法

  原型:ostream & put(char);

  用於顯示字符,可以用類方法表示法來調用它:

  cout.put('W');

  和<<運算符一樣,該函數也返回一個指向調用對象的引用,因此可以用它將拼接輸出:

  cout.put('w').put('t');

  • write()方法

  模板原型:basic_ostream<charT,traits> & write(const char_type* s,streamsize n);

  write()的第一個參數提供了要顯示的字符串的地址,第二個參數指出要顯示多少個字符,使用cout調用write()時,將調用char具體化,因此返回類型為ostream&,

  這使得可以將輸出拼接起來。

  write()方法並不會在遇到空字符時自動停止打印字符,而只是打印指定數目的字符,即使超出了字符串的邊界。

  • 刷新輸出緩沖區

  控制符flush刷新緩沖區,而控制符endl刷新緩沖區,並插入一個換行符。這兩個控制符的使用方式與變量名相同:

  cout<<"Hello"<<flush;

  cout<<"world"<<endl;

  控制符也是函數,可以直接調用flush()來刷新cout緩沖區:

  flush(cout);

  然而,ostream類對<<運算符進行了重載,所以可用下述表達式替換函數調用:

  cout<<flush;

  因此可以用更為方便的插入表示法來成功地進行刷新。

  • 用cout進行格式化

  1.修改顯示時使用的計數系統

    要控制整數以十進制、十六進制還是八進制顯示,可以使用dec、hex和oct控制符。

    例如,下面的函數調用將cout 對象的計數系統格式狀態設置為十六制:
    hex (cout) ;

    完成上述設置后,程序將以十六進制形式打印整數值,直到將格式狀態設置為其他選項為止。

    注意,控制符不是成員函數,因此不必通過對象來調用。

    雖然控制符實際上是函數,但它們通常的使用方式為:

    cout<<hex;

  2.調整字段寬度

    可以使用width成員函數將長度不同的數字放到寬度相同的字段中,該方法的原型為:
    int width() ;
    int width(int i) ;
    第一種格式返回字段寬度的當前設置:第二種格式將字段寬度設置為 i個空格,並返回以前的字段寬度值。這使得能夠保存以前的值,以便以后恢復寬度值時使用。
    width()方法只影響將顯示的下一個項目,然后字段寬度將恢復默認值。

    使用方法如:cout.width(5);

  3.填充字符

    在默認情況下,cout用空格填充字段中未被使用的部分,可以用fill()成員函數來改變填充字符。(cout輸出時默認右對齊)

    例如,下面的函數調用將填充字符改為星號:

    cout.fill('*');

  4.設置浮點數的顯示精度

    浮點數精度的含義取決於輸出模式。有三種模式:默認模式、定點模式和科學模式。

    在默認模式下,它指的是顯示的總位數。在定點模式和科學模式下,精度指的是小數點后面的位數。已經知道, C+的默認精度為6位(但未尾的0將不顯示)。

    precision( )成員函數使得能夠選擇其他值。例如,下面語句將cout的精度設置為2:

      cout.precision(2) ;

    和width()的情況不同,但與fill()類似,新的精度設置將一直有效,直到被重新設置。
  5.打印末尾的0和小數點

    ios_base類提供了一個setf()函數,能夠控制多種格式化特性。這個類還定義了多個常量,可用作該函數的參數。

      下面的函數調用使cout顯示末尾小數點:

    cout.setf(ios_base::showpoint);

    使用默認的浮點格式時,上述語句還將導致末尾的0被顯示出來。

  6.setf()函數

    setf()函數有兩個原型。第一個為:

    fmtflags  setf(fmtflags);

       其中fmtflags是bitmask類型的typedef名,用於存儲格式標記。該名稱是在ios_base類中定義的。

    這個版本的setf()用來設置單個位控制的格式信息,參數是一個fmtflags值,指出要設置哪一位。返回值是類型為fmtflags的數字,指出所有標記以前的設置,

    如果打算以后恢復原始設置,則可以保存這個值。

    ios_base類定義了代表位值的常量,使用時,必須加上作用域解析運算符。

格式常量
常量 含義
ios_base ::boolalpha 輸入和輸出bool值,可以為true或false
ios_base::showbase 對於輸出,使用C++基數前綴(0, 0x)
ios_base::showpoint 顯示末尾的小數點
ios_base::uppercase 對於16進制輸出,使用大寫字母,E表示法
ios_base::showpos 在正數前面加上+

 

    第二個setf()原型接受兩個參數,並返回以前的設置:

    fmtflags setf(fmtflags,fmtflags);

    函數的這種重載格式用於設置由多位控制的格式選項。第一參數和以前一樣,也是一個包含了所需設置的fmtflags值。第二參數指出要清除第一個參數中的哪些位。

setf(long,long)的參數
第二個參數 第一個參數 含義
ios_base::basefield  ios_base::dec  使用10進制
ios_base::oct  使用8進制
ios_base::hex  使用16進制
ios_base::floatfield ios_base::fixed  使用定點計數法(即一般計數法)
ios_base::scientific  使用科學計數法
ios_base::adjustfield  ios_base::left  左對齊
ios_base::right  右對齊
ios_base::internal  符號或基數前綴左對齊,值右對

  在C++標准中,定點表示法和科學表示法都有下面兩個特征:

  • 精度指的是小數位數, 而不是總位數:
  • 顯示末尾的0。

   調用setf()的效果可以通過unsetf()消除,后者的原型為:

  void unsetf(fmtflags mask);

  其中,mask是位模式,mask中所有的為都設置為1,將使得對應的位被復位。

  您可能注意到了,沒有專門指示浮點數默認顯示模式的標記,系統的工作原理如下:僅當只有定點位被設置時使用定點表示法;僅當只有科學位被設置時使用科學表示法;

  對於其他組合,如沒有位被設置或兩位都被設置時,將使用默認模式。因此,啟用默認模式的方法之如下:
  cout.setf(0, ios_base::floatfield);

  第二個參數關閉這兩位,而第一個參數不設置任何位。一種實現同樣目標的簡捷方式是,使用參數is:floatfield來調用函數unsetf( ):

  cout .unsetf (ios_ base: :floatfield);

  如果已知cout處於定點狀態,則可以使用參數ios_base:fixed 調用函數unsetf( )來切換到默認模式;然而,無論cout的當前狀態如何,使用參數ios_base:floatfield 調用函數unsetf( )  

  都將切換到默認模式,因此這是一種更好的選擇。

  7.標准控制符

  如:下面的語句打開左對齊和定點模式:

    cout<<left<<fixed;

  8.頭文件iomanip

  C++在頭文件iomanip中提供了其他一些控制符,三個最常用的控制符為setprecision()、setfill()、setw(),它們分別用來設置精度、填充字符和字段寬度。

  setprecision( )控制符接受一個指定精度的整數參數;

   sefill( )控制符接受一個指定填充字符的char參數;

   setw( )控制符接受一個指定字段寬度的整數參數。

  由於它們都 是控制符,因此可以用cout語句連接起來。這樣,setw( )控制符在顯示多列值時尤其方便。





 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM