標準I/O物件:cin,cout,cerr,clog
- cout; //全域性流物件 輸出資料到顯示器
- cin; //cerr沒有緩衝區 clog有緩衝區
- cerr; //標準錯誤 輸出資料到顯示器
- clog; //標準日誌 輸出資料到顯示器
一、標準輸入流
cin.get()
//一次只能讀取一個字元
char ch;
while ((ch = cin.get()) != EOF){//EOF就是鍵盤Ctrl+z,常被作為結束的標誌
cout << ch << endl;
}
/*
結果:
cin
c
i
n
*/
cin.get(一個引數)
//讀一個字元
char ch2;
cin.get(ch2); //讀取一個字元
cout << ch2 << endl;
/*
結果:
cin
c
*/
cin.get(三個引數)
//可以讀字串
char buf[256] = { 0 };
cin.get(buf, 256); //從緩衝區讀一個字串
cout << buf;
/*
結果:
輸入:cin.get() 111
輸出:cin.get() 111
*/
cin.getline()
char buf[256] = { 0 };
cin.getline(buf, 256); //讀取一行資料
cout << buf;
/*
輸入:cin.getline() cin.get()
輸出:cin.getline() cin.get()
*/
cin.ignore()
有時候你只想取緩衝區的一部分,而捨棄另一部分,這是就可以使用cin.ignore(),其使用方法是:
cin.ignore(int intExp, char chExp);
其中intExp 是一個整型表示式,也可以是一個整型數值,這個數值表示在一行中忽略的字元的最大數目,比如說intExp=100;還有一個引數chExp,是一個字元表示式。表示如果遇到一個字元值等於chEXP,那麼就停止ignore(),如果ignore100個字元之後還沒遇到值等於chEXP的字元,那也得停止ignore(),所以100是ignore()所忽略的最大字元數。
char ch;
cin.get(ch); //從緩衝區要資料 阻塞
cout << ch << endl;
cin.ignore(10); //忽略當前字元 從緩衝區取走了
cin.get(ch);
cout << ch << endl;
/*
結果:
輸入:asdfghjklzxcvbnm
輸出:a
c
*/
cin.peek()
此函式返回輸入流中的下一個字元,但是並不將該字元從輸入流中取走——相當於只是看了一眼下一個字元,因此叫 peek。
cin.peek() 不會跳過輸入流中的空格、回車符。在輸入流已經結束的情況下,cin.peek() 返回 EOF。
在輸入資料的格式不同,需要預先判斷格式再決定如何輸入時,peek() 就能起到作用。
cout << "請輸入陣列或者字串:" << endl;
char ch;
ch = cin.peek(); //偷窺一下緩衝區,返回第一個字元
if (ch >= '0' && ch <= '9') {
int number;
cin >> number;
cout << "您輸入的是數字:" << number << endl;
}
else {
char buf[256] = { 0 };
cin >> buf;
cout << "您輸入的是字串:" << buf << endl;
}
/*
結果:
請輸入陣列或者字串:
acdsf
您輸入的是字串:acdsf
*/
cin.putback()
iostream是一個類,有自己的buffer。你每次cin>>a,它就把buffer減一,放到a中去。cin.putback(a)就是把a的內容放回buffer中。
cout << "請輸入字串或者數字:" << endl;
char ch;
cin.get(ch); //從緩衝區取走一個字元
if (ch >= '0' && ch <= '9') {
//ch放回到緩衝區
cin.putback(ch);
int number;
cin >> number;
cout << "您輸入的是數字:" << number << endl;
}
else {
cin.putback(ch);
char buf[256] = { 0 };
cin >> buf;
cout << buf << endl;
}
/*
結果:
請輸入字串或者數字:
33333
您輸入的是數字:33333
*/
二、標準輸出流
cout.flush()
所要輸出的內容會先存入緩衝區,而 cout.flush()的作用正是強行將緩衝區的資料清空。這樣在關閉讀寫流時,就不會丟失資料。
cout.put()
cout.put()專用於向輸出流緩衝區中新增單個字元,
cout.write()
write() 成員方法專用於向輸出流緩衝區中新增指定的字串,初學者可以簡單的理解為輸出指定的字串。其語法格式如下:
ostream&write(const char * s,streamsize n);
其中,s 用於指定某個長度至少為 n 的字元陣列或字串;n 表示要輸出的前 n 個字元。
cout << "hello world" <<endl;
//cout.flush();
cout.put('h').put('e').put('l') << endl;
cout.write("hello Zhaosi!", strlen("hello Zhaosi!"));
/*
結果:
hello world
hel
hello Zhaosi!
*/
cout.width()
- 控制符int width()將用來調整欄位的寬度,因為width是成員函式,所以要通過物件來呼叫,比如cout.width()將顯示當前的欄位寬度,預設為0,而cout.width(3)將把欄位寬度設定為3。注意C++容納欄位的方式為給欄位分配剛好合適的寬度來容納欄位,所以C++中預設的欄位寬度為0,以適合於所有的欄位。
- width的預設對齊方式為右對齊,即如果cout.width(12)如果欄位沒有這麼寬,則將在欄位的左邊填以空格來達到12個欄位的寬度。
- 還要注意的是width隻影響他設定後的下一個輸出,再下一個欄位輸出後,後繼的欄位被恢復為預設值,比如cout.width(12); cout<<2<<3;則輸出2時會以12欄位的寬度顯示,但顯示3時就會以預設的方式顯示了。
- int width()呼叫他時將會反回上一次的欄位寬度的值。
cout.fill()
成員函式fill()可以用來改變填充的字元,比如cout.fill('*'),使用*填充空白部分。
但是千萬要注意:fill函式在設定後將一直有效,除非被重新設定。
而且cout.fill('*')會返回設定'*'之前的fill字元' ' 所以如果用cout<<cout.fill('*')就會輸出這個空格
cout.setf(標記)
cout.setf()的作用是通過設定格式標誌來控制輸出形式
- 1.使用控制符控制輸出格式
控制符 作用
dec 設定整數的基數為10
hex 設定整數的基數為16
oct 設定整數的基數為8
setbase(n) 設定整數的基數為n(n只能是16,10,8之一)
setfill(c) 設定填充字元c,c可以是字元常量或字元變數
setprecision(n) 設定實數的精度為n位.在以一般十進位制小數形式輸出時,n代表有效數字.在以fixed(固定小數位數)形式和scientific(指數)形式輸出時,n為小數位數.
setw(n) 設定欄位寬度為n位.
setiosflags(ios::fixed) 設定浮點數以固定的小數位數顯示.
setiosflags(ios::scientific) 設定浮點數以科學計數法(即指數形式)顯示.
setiosflags(ios::left) 輸出資料左對齊.
setiosflags(ios::right) 輸出資料右對齊.
setiosflags(ios::shipws) 忽略前導的空格.
setiosflags(ios::uppercase) 在以科學計數法輸出E和十六進位制輸出字母X時,以大寫表示.
setiosflags(ios::showpos) 輸出正數時,給出“+”號.
resetiosflags 終止已設定的輸出格式狀態,在括號中應指定內容. - 2.用流物件的成員控制輸出格式
流成員函式 與之作用相同的控制符 作用
precision(n) setprecision(n) 設定實數的精度為n位.
width(n) setw(n) 設定欄位寬度為n位.
fill(c) setfill(c) 設定填充字元c.
setf( ) setiosflags( ) 設定輸出格式狀態,括號中應給出格式狀態,內容與控制符setiosflags括號中內容相同.
ubsetf( ) resetiosflags( ) 終止已設定的輸出格式狀態.
cout.width(10);
cout.setf(ios::hex); - 3.設定格式狀態的格式標誌
格式標誌 作用
ios::left 輸出資料在本域寬範圍內左對齊
ios::right 輸出資料在本域寬範圍內右對齊
ios::internal 數值的符號位在域寬內左對齊,數值右對齊,中間由填充字元填充
ios::dec 設定整數的基數為10
ios::oct 設定整數的基數為8
ios::hex 設定整數的基數為16
ios::showbase 強制輸出整數的基數(八進位制以0打頭,十六進位制以0x打頭)
ios::showpoint 強制輸出浮點數的小點和尾數0
ios::uppercase 在以科學計數法輸出E和十六進位制輸出字母X時,以大寫表示
ios::showpos 輸出正數時,給出“+”號.
ios::scientific 設定浮點數以科學計數法(即指數形式)顯示
ios::fixed 設定浮點數以固定的小數位數顯示
ios::unitbuf 每次輸出後重新整理所有流
ios::stdio 每次輸出後清除stdout,stderr
//成員方法的方式
int number = 10;
cout << number << endl;
cout.unsetf(ios::dec); //解除安裝當前預設的的10進位制輸出方式
cout.setf(ios::oct); //八進位制輸出
cout.setf(ios::showbase);
cout << number << endl;
cout.unsetf(ios::oct); //解除安裝8進位制
cout.setf(ios::hex);
cout << number << endl;
cout.width(10);
cout.fill('*');
cout.setf(ios::left);
cout << number << endl;
//通過控制符
int number2 = 10;
cout << hex
<< setiosflags(ios::showbase)
<< setw(10)
<< setfill('*')
<< setiosflags(ios::left)
<< number2
<< endl;
/*
結果:
10
012
0xa
0xa*******
0xa*******
*/