C++的輸入和輸出流詳解
輸入和輸出流
從鍵盤輸入數(shù)據(jù),輸出到顯示器屏幕。這種輸入輸出稱為標(biāo)準(zhǔn)的輸入輸出,簡(jiǎn)稱標(biāo)準(zhǔn)I/O。
從磁盤文件輸入數(shù)據(jù),數(shù)據(jù)輸出到磁盤文件簡(jiǎn)稱文件I/O。
對(duì)內(nèi)存中指定的空間進(jìn)行輸入輸出,通常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間(存儲(chǔ)任何信息),稱為字符串輸入輸出,簡(jiǎn)稱為串I/O
緩沖區(qū):無(wú)論是輸入還是輸出都是存在緩存區(qū)的。
標(biāo)準(zhǔn)輸入流
常用的成員函數(shù)
1,cin.get()
獲取一個(gè)字符
char c = cin.get();
使用cin.get()可以家當(dāng)緩沖區(qū)中的換行符拿走。注意返回值是什么類型的,拿走的數(shù)據(jù)再輸出的時(shí)候就是什么類型。
2,cin.get(兩個(gè)參數(shù))
獲取字符串
參數(shù)是字符串?dāng)?shù)組名和個(gè)數(shù)
使用cin.get(兩個(gè)參數(shù))那字符串的時(shí)候,換行符\0會(huì)遺留在緩沖區(qū)中。
char buf[100] = {0}; cin.get(buf, 100); cout << buf<< endl;
只滿足字符數(shù)組,且輸出的字符個(gè)數(shù)總比第二個(gè)參數(shù)少1.(原因:字符數(shù)組最后一個(gè)字符是不可見(jiàn)字符’\0’)
3,cin.getline()
獲取字符串
接收一個(gè)字符串并輸出
和cin.get(兩個(gè)參數(shù))相似,不會(huì)將換行符加入字符串,但是也不會(huì)留在緩沖區(qū)中,而是直接扔掉。
char buf[100] = {0}; cin.getline(buf, 100); cout << buf << endl;
可以有第三個(gè)參數(shù),就是終止位置(一個(gè)字符,不包括這個(gè)字符)
4,cin.ignore()
忽略一個(gè)字符
括號(hào)中可以填入?yún)?shù),參數(shù)就是忽略字符的個(gè)數(shù)。默認(rèn)是一個(gè)。
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
緩沖區(qū)中,輸入了一個(gè)a,然后cin.peek()只是看了一眼,并沒(méi)有拿走,所以調(diào)用cin.get()的時(shí)候可以直接從緩沖區(qū)中拿。
6,cin.putback()
放回(原來(lái)的位置)
char c = cin.get(); cin.putback(c);//將從緩沖區(qū)拿走的字符返回原位置 char buf[100] = { 0 }; cin.getline(buf, 100);//接收的是緩沖區(qū)中的字符串,輸出的對(duì)象是buf這個(gè)字符數(shù)組。 cout << buf << endl;
輸入hello,輸出仍是hello。
小案例
案例一:判斷輸入的內(nèi)容是字符串還是數(shù)字(不存在混合的情況)
int main() { cout << "請(qǐng)輸入一個(gè)數(shù)字或者一個(gè)字符串" << endl; char c = cin.peek(); if (c >= '0' && c <= '9') { cout << "數(shù)字" << endl; int num; cin >> num; cout << num << endl; } else { cout << "字符串" << endl; char buf[100] = { 0 }; cin >> buf; cout << buf << endl; } return 0; }
案例二:
用戶輸入0-10之間的數(shù)字,如果輸入有誤,重新輸入。
int main() { cout << "請(qǐng)輸入一個(gè)0-10之間的數(shù)字" << endl; while(true) { int num; cin >> num; if (num >= 0 && num <= 10) { cout << "輸入正確,輸入的值為: " << num << endl; break; } else { cout << "輸入有誤,請(qǐng)重新輸入" << endl; } } return 0; }
如果輸入的是一個(gè)數(shù)字,那么一切正常。但是如果輸入字符,那么就是陷入死循環(huán)。這個(gè)時(shí)候就是緩存區(qū)出現(xiàn)了問(wèn)題。
所以,如果沒(méi)有輸入正確,那么可以進(jìn)行清空緩存區(qū)和重置標(biāo)志位。(這個(gè)標(biāo)志位如果是0表示緩沖區(qū)正常,1就是不正常)
cin.clear();//清空緩沖區(qū) cin.sync();//重置標(biāo)志位 cin.ignore();//幫助清空2013版本以上需要加。 //上面三句話連著使用。 cin.fail();//標(biāo)志位
標(biāo)準(zhǔn)輸出流
1,cout.put()
,向緩沖區(qū)寫一個(gè)字符
括號(hào)里面是啥,就打印啥。
可以拼接使用:cout.put(‘h’).cout.put(‘a’);//打印結(jié)果就是:ha
2,cout.write(兩個(gè)參數(shù))
,
兩個(gè)參數(shù)是char* ,和 對(duì)應(yīng)字符串的長(zhǎng)度(不能超過(guò)最大長(zhǎng)度)。從字符串中拿走規(guī)定長(zhǎng)度的內(nèi)容輸出。
char arr[] = "hello"; cout.write(arr, strlen(arr));//hello
但是如果要全部打印的話,直接使用cout<<arr<<endl;也是可以的。優(yōu)點(diǎn)應(yīng)該是可以打印規(guī)定長(zhǎng)度的字符串。
格式化輸出:
(1) 通過(guò)流成員函數(shù) 格式化輸出
int main() { int num = 99; cout.width(5);//指定寬度為20(向前面加空格),結(jié)果: 99 cout.fill('*');//空格處都填充上*,結(jié)果:***99,(填充內(nèi)容會(huì)被下一此的填充內(nèi)容覆蓋) cout.setf(ios::left);//輸出的文本左對(duì)齊,結(jié)果99*** cout.unsetf(ios::dec);//卸載十進(jìn)制 cout.setf(ios::hex);//安裝十六進(jìn)制,結(jié)果為63*** cout.setf(ios::showbase);//顯示基數(shù),結(jié)果0x63*。輸出對(duì)應(yīng)進(jìn)制的基數(shù),16進(jìn)制就是0x cout.unsetf(ios::hex);//卸載十六進(jìn)制 cout.setf(ios::oct);//安裝八進(jìn)制,結(jié)果為0143*。 cout << num << endl; return 0; }
(2) 使用控制符 格式化輸出
如果使用控制符格式化輸出的話,需要引用頭文件
#include<iomanip>
指定寬度:
int number = 110; cout << setw(20)//指定寬度為20,然后默認(rèn)將數(shù)據(jù)右對(duì)齊 << number << endl; //運(yùn)行結(jié)果: 110
填充:
int number = 110; cout << setw(20) << setfill('*')//填充,位置在前在后無(wú)所謂 << number << endl; //運(yùn)行結(jié)果:*****************110
顯示基數(shù):
int number = 110; cout << setw(20) << number << setfill('*') << setiosflags(ios::showbase)//顯示基數(shù) << endl; //運(yùn)行結(jié)果:*****************110,和上面的沒(méi)有區(qū)別,因?yàn)槭M(jìn)制是沒(méi)有基數(shù)的。
設(shè)置左對(duì)齊:
int number = 110; cout << setw(20) << setfill('*') << setiosflags(ios::showbase) << setiosflags(ios::left)//設(shè)置左對(duì)齊 << number << endl; //運(yùn)行結(jié)果:110***************** //這個(gè)時(shí)候需要注意一下,如果按照剛才將number寫在前面的時(shí)候是得不到想要的結(jié)果的,所以應(yīng)該將最終要輸出的內(nèi)容盡量寫在右邊。
顯示十六進(jìn)制:
int number = 110; cout << setw(20) << setfill('*') << setiosflags(ios::showbase) << setiosflags(ios::left) << hex//顯示16進(jìn)制 << number << endl; //運(yùn)行結(jié)果:0x6e****************
文件讀寫
寫文件:
需要引頭文件:#include<fstream>
(文件流)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)靜態(tài)存儲(chǔ)通訊錄的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)靜態(tài)存儲(chǔ)的通訊錄,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09C語(yǔ)言基于graphics.h實(shí)現(xiàn)圣誕樹
這篇文章主要介紹了圣誕樹代碼,c語(yǔ)言編程,基于graphics.h實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12深入探索C++ string的底層實(shí)現(xiàn)
C語(yǔ)言中的字符串是以字符數(shù)組的形式存儲(chǔ)的,每個(gè)字符占用一個(gè)字節(jié)的內(nèi)存空間,本文我們將和大家一起深入探討一下string的底層實(shí)現(xiàn),感興趣的小伙伴快來(lái)和小編一起吧2023-08-08C語(yǔ)言鏈表實(shí)現(xiàn)商品庫(kù)存管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)商品庫(kù)存管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02