計算機概論:C/C++程式設計

 

第7 檔案輸入/輸出

 

 


授課教師:陳慶瀚

WWW : http://www.miat.ee.isu.edu.tw/cpp

E-mail : pierre@isu.edu.tw   

 


7.5輸入/輸出的格式化

格式化資料有幾個好處,首先資料排列整齊,易於閱覽分析和管理,其次格式化的資料也利於檔案讀取的方便性和效率。有三種方式可以對資料輸出進行格式化,第一種是使用ios物件的格式設定旗標;第二種是使用串流物件的成員函式來指定輸出資料的寬度、填充字元或小數點後面的輸出位數;第三種方式使用一種特殊的指令,稱為格式操作子(manipulator)。這三種格式化資料的方法不但適用在檔案輸入/輸出串流物件(fstream, ifstream, ofstream等物件),也適用在所有的串流資料輸入/輸出串流物件(包含鍵盤輸入cin和螢幕輸出cout)

設定ios物件的格式旗標

ios物件中,我們可以根據需要設定各種格式旗標,以下列出所有設定值的旗標名稱:

skipws

當設定ios:: skipws,則輸出串流資料時空白字元(spaces, tabs, endl)會被忽略。

left

當設定ios:: left,輸出串流資料向左切齊。
right

當設定ios:: right,輸出串流資料向左切齊。
internal

當設定ios:: internal,不同位數的數值會被補齊。
dec
octhex

當設定ios::dec, ios::oct, ios::hex,輸出資料將會分別以10進制、8進制和16進制來呈現。

showbase

當設定ios:: showbase輸出資料將會顯示其數值的進位基底(base of value)16進位的數值F3就會顯示0xF3

showpoint

當設定ios:: showbase輸出浮點數數值時,小數點後面的數元(digit) 不管是不是0,都會全部輸出。

uppercase

當設定ios:: uppercase輸出浮點數數值時,會將數值中的英文字母轉為大寫,如2.5e-4變成2.5E-4

showpos

當設定ios:: showpos輸出正整數時,前面會加上'+'號,例如輸出123,顯示+123

scientific

當設定ios:: scientific數值將以科學記法輸出。例如123.23輸出時就會變成1.232300e+02

fixed

當設定ios:: scientific數值將以科學記法輸出。例如123.23輸出時就會變成1.232300e+02

unitbuf

當設定ios:: unitbuf,則在每一次輸出動作之後,C++I/O系統就被更新一次。

 

了解上述格式化的旗標之後,接下來我們要看看如何使用它們。對於任何輸出串流物件─包括coutofstream,我們都可以使用串流物件的成員函式setf( )來設定其格式,其語法為:

   串流物件名稱.setf(ios::格式化旗標);

例如

   cout.setf(ios:: scientific);

我們還可以用邏輯OR(|)來設定設定兩種以上的旗標,例如:

   cout.setf(ios:: scientific| ios:: showpos);

便可以同時設定兩種格式化旗標:ios:: scientificios:: showpos或著我們也可以將其分解為兩行,其功能是相同的:

   cout.setf(ios:: scientific);

   cout.setf(ios:: showpos);

 

/*----------------------------------------------------*/

//                  範例程式7-11

//                  設定格式化旗標

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>

void main()

{

   int x=123;

   float y=123.23;

   cout.setf(ios::showpos);

   cout.setf(ios::scientific);

   cout << x << " " << y << " ";

}

這個程式的執行結果如下:

+123 +1.232300e+02

課堂練習

請將範例程式7-11改成檔案輸出。

 

除了設定格式旗標的函式,我們還可以清除已設定的格式旗標。對於任何輸出串流物件─包括coutofstream,我們都可以使用串流物件的成員函式unsetf( )來清除其原有的格式旗標,其語法為:

   串流物件名稱.unsetf(ios::格式化旗標);

例如

   cout.unsetf(ios::scientific);

 

/*----------------------------------------------------*/

//                  範例程式7-12

//                 清除格式化旗標

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>

void main()

{

   int x=123;

   float y=123.23;

   cout << x << " " << y <<endl;  //設定格式化旗標前的輸出

   cout.setf(ios::showpos);

   cout.setf(ios::scientific);

   cout << x << " " << y <<endl;  //設定格式化旗標後的輸出

   cout.unsetf(ios::showpos);

   cout << x << " " << y <<endl;  //清除格式化旗標ios::showpos後的輸出

}

這個程式的執行結果如下:

123 123.23

+123 +1.232300e+02

123 1.232300e+02

 

使用串流物件的格式化成員函式

串流物件(fstream, ifstream, ofstream, cincout)可以使用源於ios的三個成員函式來指定輸出資料的寬度、填充字元或小數點後面的輸出位數等格式。這三個函式分別是:

int width(int len);
char fill(char ch);
int precision(int num);

width(int len)是用來設定輸出數值的欄位寬度,這裡的欄位指字元空間的個數。當它被呼叫時,除了設定往後該串流物件所輸出的資料的寬度均為len之外,同時也傳回原本所用的寬度。

輸出浮點數的資料時,我們可以使用precision(int num)指定顯示小數點後面num位數,num的預設值是6,也就是說,如果我們不設定precision(),則所有的浮點數資料都會顯示到小數點後面6位數。

最後,如果想填補一些資料間的空格,可以使用fill(char ch)。這裡ch是我們想要填入的字元或符號。

/*----------------------------------------------------*/

//                  範例程式7-13

//             使用串流物件的格式化成員函式

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>

void main()
{

  int x=123;

  float y=123.23;

 

  cout.setf(ios::scientific);

  cout << x << " " << y << "\n";

 

  cout.precision(2); // 浮點數輸出精度到小數點後面兩位數

  cout.width(10);    //  每個資料使用10個字元空間

  cout << x << " " << y << "\n";

 

  cout.width(12);  // 每個資料改用12個字元空間

  cout.fill('*');  // 資料前空格字元填補 *

  cout << y << " " << x << "\n";

  cout << y << " " << x << "\n";

}

這個程式的執行結果如下:

123 1.232300e+02

       123 1.23e+02

*********123 1.23e+02

****1.23e+02 123

 

使用格式操作子(manipulator)

 

格式操作子(manipulator)是一組特殊的函式,它們可以被鑲嵌在串流I/O的陳述中。下面列出所有格式操作子:

 

格式操作子

功能

輸入/輸出

dec

輸入/輸出資料為十進位

輸入和輸出

endl

換行並更新輸出串列

輸出

ends

輸出一個NULL

輸出

flush

更新輸出串列

輸出

hex

輸入/輸出資料為十六進位

輸入和輸出

oct

輸入/輸出資料為八進位

輸入和輸出

resetiosflags(flag f)

清除格式化旗標

輸入和輸出

setbase(int base)

設定進位系統的底數

輸出

setfill(char ch)

設定填充字元

輸出

setiosflags(flag)

設定格式化旗標

輸入和輸出

setprecision(int n)

設定小數點後的digits位數

輸出

setw(int w)

設定資料的字元空間寬度

輸出

ws

跳躍空白鍵(space, tab, newline)

輸入和輸出

 

使用這些格式操作子,必須先引入標頭檔<iomanip.h>範例程7-147-15分別展示檔案輸出和螢幕輸出時格式操作子的使用範例。

 

/*----------------------------------------------------*/

//                  範例程式7-14

//                 使用格式操作子

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

#include <iomanip.h>

void main()

{

  ofstream out("test");

//格式操作子嵌入輸出陳述(out<<......)

  out << setiosflags(ios::fixed);

  out << setprecision(2) << 1000.243 << endl;

  out << setw(20) << "Hello there.";

}

這個程式的執行結果如下:

1000.24

        Hello there.

 

/*----------------------------------------------------*/

//                  範例程式7-15

//                 使用螢幕輸出的格式操作子

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>
#include <iomanip.h>

void main()
{
  cout << setiosflags(ios::showpos);
  cout << setiosflags(ios::scientific);
  cout << 318 << " " << 3.14159;
}

這個程式的執行結果如下:

+318 +3.141590e+00

 

在全部的格式操作子中,只有一個格式操作子ws是專用於輸入,我們看看它的使用:

/*----------------------------------------------------*/

//                  範例程式7-16

//               專用於鍵盤輸入的格式操作子

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>
#include <iomanip.h>
void main()
{
   char s[80];

   ofstream out("test");

   cout<<"輸入一個含有空格的字串: ";

   cin >> ws >> s;  // 讀入字串s直到空白鍵

   out << s;         // 輸出s直到空白鍵

   cin >> ws >> s; // 由空白鍵繼續讀入字串

   out << s;        // 輸出s直到空白鍵

}

這個程式的執行結果如下:

輸入一個含有空格的字串: Hello World!

打開test檔,我們將看到

HelloWorld!

 

/*----------------------------------------------------*/

//                  範例程式7-17

//               專用於檔案輸入的格式操作子

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

#include <iomanip.h>

 

void main()

{

   char s[100];

   ifstream in("7-17.cpp");

   while(in)  // 如果檔案物件指標不在最底部位置

   {

      in >> ws >> s;  // 讀入字串s直到空白鍵

      cout << s;         // 輸出s直到空白鍵

   }

}

這個程式的執行結果如下:

 

#include<fstream.h>

#include<iomanip.h>

voi dmain()

{

chars[100];

ifstreamin("7-17.cpp");

while(!in)

{

in>>ws>>s;//讀入字串s直到空白鍵

out<<s;//輸出s直到空白鍵

}

}

 

課堂練習TD7-1

將九九乘法表輸出至99.txt檔案。

課堂練習TD7-2

宣告一個9x9大小的整數二維陣列,將值從9x9.txt檔案讀入,計算所有陣列值總和並輸出至螢幕。


 

計算機概論:C/C++程式設計

義守大學電機系 陳慶瀚 
2001.12.26

 

謝孟媛 dvd -
情趣用品 -
飛鳥遊戲 -
遊戲基地 -
PATEK PHILIPPE -
xyz資訊工作坊 -
xyz軟體王 -
英文老師 -
沛納海 -
xyz軟體下載倉庫 -
基測試題 -
CARTIER 卡地亞 -
林晟數學 -
PIAGET -
費洛蒙情定 -
xyz -
軟體大補帖 -
高國華補習班 -
game淘 -
ps2台片 -
wii超級瑪莉攻略 -
情定費洛蒙 -
wii價格2011 -
xbox 360台片 -
tvgame360 -
愛馬仕 -
春藥專賣店 -
ps3價錢 2011 -
ps2遊戲王 -
wii遊戲片專賣店 -
百達翡麗 PATEK PHILIPPE -
壯陽藥品哪買 -
海賊王 -
春藥王 -
xyz軟體下載倉庫 -
壯陽食物 -
xbox360 -
催情藥 -
TISSOT 天梭 -
ps2遊戲燒錄 -
威而剛哪裡買 -
一夜情婦 -
xbox 360台片專賣 -
國中基測題庫 -
無雙遊戲網 -
xyz軟體王 -
ps2遊戲片80元 -
基測 -
xyz軟體王下載 -
GUCCI 古馳 -
南一題庫網 -
COACH -
LOUIS VUITTON -
wii超級瑪莉 -
wii價格2011 -
魔法老師 -
催情藥專賣店 -
國小翰林題庫網 -
wii遊戲片專賣店 -
遊戲天堂 -
寶格麗 -
金榜之路 -
wii遊戲片80元 -
xbox 360遊戲片 -
wii遊戲載點 -
人類費洛蒙情定 -
xbox 360台片專賣 -
催情王 -
xyz軟體之家 -
ps2遊戲片80元 -
情色小站 -
微風廣場 -
情慾之夜 -
民視文化 -
xbox360 -
蔻馳 -
ps2遊戲燒錄 -
ps3遊戲片 -
龍騰高中題庫 -
ps3台片 -
威而剛 -
ps3價錢 2011 -
軟體王下載 -
蕭邦 CHOPARD -
龍騰 -
催情藥 -
威而剛哪裡買 -
基測題目 -
HERMES 愛馬仕 -
情定費洛蒙 -
ps2台片 -
ps3遊戲片 -
wii瑪莉兄弟遊戲 -
江詩丹頓 Vacheron Constantin -
wii超級瑪莉 -
wii遊戲片在ho99小舖 -
春藥王 -
歷屆基測試題 -
窮人軟體 -
威而柔哪裡買 -
蕭邦 -
翰林題庫網 -
一夜情婦 -
wii遊戲下載 -
xbox 360遊戲 -
壯陽食物 -
ps2遊戲片 -
sogo百貨 -
台灣情色網 -
xyz軟體王下載 -
lv2011官方網 -
wii遊戲片專賣店 -
xbox 360價錢 -
歐米茄 -
雷達錶 RADO -
xyz資訊工坊 -
儒林補習班 -
壯陽藥品 -
xyz軟體王 -
窮人遊戲 -
ps2遊戲下載 -
ps3台片 -
德周 -
sogo百貨 -
費洛蒙情定 -
壯陽藥品哪買 -
催情王 -
春藥哪裡買 -
lv2011夏季新款 -
情趣用品 -
中友百貨 -
史萊姆的第一個家 -
情色論壇 -
萬寶龍 MONT BLANC -
萬國 -
ps2遊戲下載 -
春藥哪裡買 -
xyz資訊工作坊 -
龍騰文化 -
太平洋百貨 -
軟體王 -
xbox 360台片專賣 -
ps3遊戲片在ho99小舖 -
壯陽藥 -
xyz軟體銀行 -
xbox360台片 -
魔法24 -
wii遊戲片80元 -
XYZ資訊工坊 -
CARTIER -
春藥網 -
壯陽 -
xyz 軟體補給站 -
微風廣場 -
lv2011新款型錄 -
xbox 360遊戲 -
費洛蒙 -
卡地亞 -
wii遊戲下載 -
窮人天碟 -
春藥專賣店 -
gucci2011專賣店旗艦店 -
迪奧 -
CHANEL -
xyz軟體大本營 -
xbox 360遊戲片在ho99小舖 -
台北郵購網 -
BURBERRY 巴寶莉 -
伯爵 -
遠東百貨 -
陳希 -
費洛蒙mx -
時間廣場 -
漢神百貨 -
情色論壇 -
傳政 -
軟體 -
寶格麗 BVLGARI -
名牌包俱樂部 -
時間廣場 -
威而柔 -
wii瑪莉兄弟遊戲 -
lv名牌包專賣店 -
xyz軟體大本營 -
威而柔哪裡買 -
伯爵 PIAGET -
xyz軟體銀行 -
ps3遊戲下載 -
wii超級瑪莉歐 -
無名套裝 -
xyz軟體下載倉庫 -
江詩丹頓 -
林晟 -
ps3遊戲片在ho99小舖 -
威而剛 -
費洛蒙mx -
xyz軟體之家 -
HERMES -
林晟超理解數學 -
謝孟媛 -