C++:標準I/O流

東南亞季風發表於2021-01-21

標準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*******
*/

相關文章