網站首頁 編程語言 正文
輸入和輸出流
從鍵盤輸入數據,輸出到顯示器屏幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準I/O。
從磁盤文件輸入數據,數據輸出到磁盤文件簡稱文件I/O。
對內存中指定的空間進行輸入輸出,通常指定一個字符數組作為存儲空間(存儲任何信息),稱為字符串輸入輸出,簡稱為串I/O
緩沖區:無論是輸入還是輸出都是存在緩存區的。
標準輸入流
常用的成員函數
1,cin.get()
獲取一個字符
char c = cin.get();
使用cin.get()可以家當緩沖區中的換行符拿走。注意返回值是什么類型的,拿走的數據再輸出的時候就是什么類型。
2,cin.get(兩個參數)
獲取字符串
參數是字符串數組名和個數
使用cin.get(兩個參數)那字符串的時候,換行符\0會遺留在緩沖區中。
char buf[100] = {0}; cin.get(buf, 100); cout << buf<< endl;
只滿足字符數組,且輸出的字符個數總比第二個參數少1.(原因:字符數組最后一個字符是不可見字符’\0’)
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<規定長度的字符串。
格式化輸出:
(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
指定寬度:
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
(文件流)
總結
原文鏈接:https://blog.csdn.net/qq_51399192/article/details/123170704
相關推薦
- 2022-03-14 stream實現list根據對象中多個屬性分組,并取分組后最新數據
- 2022-07-10 uniapp下拉刷新和上拉加載的實現
- 2022-06-29 C++詳細講解IO流原理_C 語言
- 2022-11-04 一文理解Redux及其工作原理_React
- 2022-12-07 C#?XML文件操作之相機參數保存和讀取_C#教程
- 2022-08-17 C++超詳細實現堆和堆排序過像_C 語言
- 2022-04-09 SpringBoot 項目打包成jar包,并執行Jar文件
- 2022-12-28 詳解Flink同步Kafka數據到ClickHouse分布式表_數據庫其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支