首頁 > 軟體

C++的輸入和輸出流詳解

2022-03-01 13:00:22

輸入和輸出流

從鍵盤輸入資料,輸出到顯示器螢幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準I/O。

從磁碟檔案輸入資料,資料輸出到磁碟檔案簡稱檔案I/O。

對記憶體中指定的空間進行輸入輸出,通常指定一個字元陣列作為儲存空間(儲存任何資訊),稱為字串輸入輸出,簡稱為串I/O

緩衝區:無論是輸入還是輸出都是存在快取區的。

標準輸入流

常用的成員函數

1,cin.get()獲取一個字元

char c = cin.get();

使用cin.get()可以家當緩衝區中的換行符拿走。注意返回值是什麼型別的,拿走的資料再輸出的時候就是什麼型別。

2,cin.get(兩個引數)獲取字串

引數是字串陣列名和個數

使用cin.get(兩個引數)那字串的時候,換行符會遺留在緩衝區中。

char buf[100] = {0};
cin.get(buf, 100);
cout << buf<< endl;

只滿足字元陣列,且輸出的字元個數總比第二個引數少1.(原因:字元陣列最後一個字元是不可見字元’’)

3,cin.getline()獲取字串

接收一個字串並輸出

和cin.get(兩個引數)相似,不會將換行符加入字串,但是也不會留在緩衝區中,而是直接扔掉。

char buf[100] = {0};
cin.getline(buf, 100);
cout << buf << endl;

可以有第三個引數,就是終止位置(一個字元,不包括這個字元)

4,cin.ignore()忽略一個字元

括號中可以填入引數,引數就是忽略字元的個數。預設是一個。

cin.ignore();
char c = cin.get();//ab
cout << c << endl;//b,將a忽略了

5,cin.peak()偷窺

char c = cin.peek();
cout << c << endl;//a
char m = cin.get();
cout << m << endl;//a

緩衝區中,輸入了一個a,然後cin.peek()只是看了一眼,並沒有拿走,所以呼叫cin.get()的時候可以直接從緩衝區中拿。

6,cin.putback()放回(原來的位置)

char c = cin.get();
cin.putback(c);//將從緩衝區拿走的字元返回原位置
char buf[100] = { 0 };
cin.getline(buf, 100);//接收的是緩衝區中的字串,輸出的物件是buf這個字元陣列。 
cout << buf << endl;

輸入hello,輸出仍是hello。

小案例

案例一:判斷輸入的內容是字串還是數位(不存在混合的情況)

int main()
{
	cout << "請輸入一個數位或者一個字串" << endl;
	char c = cin.peek();
	if (c >= '0' && c <= '9')
	{
		cout << "數位" << endl;
		int num;
		cin >> num;
		cout << num << endl;
	}
	else
	{
		cout << "字串" << endl;
		char buf[100] = { 0 };
		cin >> buf;
		cout << buf << endl;
	}
	return 0;
}

案例二:

使用者輸入0-10之間的數位,如果輸入有誤,重新輸入。

int main()
{
	cout << "請輸入一個0-10之間的數位" << endl;

	while(true)
	{
		int num;
		cin >> num;
		if (num >= 0 && num <= 10)
		{
			cout << "輸入正確,輸入的值為: " << num << endl;
			break;
		}
		else
		{
			cout << "輸入有誤,請重新輸入" << endl;
		}
	}
	return 0;
}

如果輸入的是一個數位,那麼一切正常。但是如果輸入字元,那麼就是陷入死迴圈。這個時候就是快取區出現了問題。

所以,如果沒有輸入正確,那麼可以進行清空快取區和重置標誌位。(這個標誌位如果是0表示緩衝區正常,1就是不正常)

cin.clear();//清空緩衝區
cin.sync();//重置標誌位
cin.ignore();//幫助清空2013版本以上需要加。
//上面三句話連著使用。
cin.fail();//標誌位

標準輸出流

1,cout.put(),向緩衝區寫一個字元

括號裡面是啥,就列印啥。

可以拼接使用:cout.put(‘h’).cout.put(‘a’);//列印結果就是:ha

2,cout.write(兩個引數),

兩個引數是char* ,和 對應字串的長度(不能超過最大長度)。從字串中拿走規定長度的內容輸出。

char arr[] = "hello";
cout.write(arr, strlen(arr));//hello

但是如果要全部列印的話,直接使用cout<<arr<<endl;也是可以的。優點應該是可以列印規定長度的字串。

格式化輸出:

(1) 通過流成員函數 格式化輸出

int main()
{
	int num = 99;
	cout.width(5);//指定寬度為20(向前面加空格),結果:   99
	cout.fill('*');//空格處都填充上*,結果:***99,(填充內容會被下一此的填充內容覆蓋)
	cout.setf(ios::left);//輸出的文字左對齊,結果99***
    cout.unsetf(ios::dec);//解除安裝十進位制
	cout.setf(ios::hex);//安裝十六進位制,結果為63***
	cout.setf(ios::showbase);//顯示基數,結果0x63*。輸出對應進位制的基數,16進位制就是0x
	cout.unsetf(ios::hex);//解除安裝十六進位制
	cout.setf(ios::oct);//安裝八進位制,結果為0143*。
	cout << num << endl;
	return 0;
}	

(2) 使用控制符 格式化輸出

如果使用控制符格式化輸出的話,需要參照標頭檔案

#include<iomanip>

指定寬度:

    int number = 110;
	cout << setw(20)//指定寬度為20,然後預設將資料右對齊
		<< number
		<< endl;
	//執行結果:                 110

填充:

    int number = 110;
	cout << setw(20)
		<< setfill('*')//填充,位置在前在後無所謂
		<< number
		<< endl;
	//執行結果:*****************110

顯示基數:

int number = 110;
	cout << setw(20)
		<< number
		<< setfill('*')
		<< setiosflags(ios::showbase)//顯示基數
		<< endl;	
	//執行結果:*****************110,和上面的沒有區別,因為十進位制是沒有基數的。

設定左對齊:

	int number = 110;
	cout << setw(20)
		<< setfill('*')
		<< setiosflags(ios::showbase)
		<< setiosflags(ios::left)//設定左對齊
		<< number
		<< endl;	
	//執行結果:110*****************
//這個時候需要注意一下,如果按照剛才將number寫在前面的時候是得不到想要的結果的,所以應該將最終要輸出的內容儘量寫在右邊。

顯示十六進位制:

	int number = 110;
	cout << setw(20)
		<< setfill('*')
		<< setiosflags(ios::showbase)
		<< setiosflags(ios::left)
		<< hex//顯示16進位制
		<< number
		<< endl;	
	//執行結果:0x6e****************

檔案讀寫

寫檔案:

需要引標頭檔案:#include<fstream>(檔案流)

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com