1、資料 記憶體中 變數
磁碟上 檔案
2、把資料從其他的裝置搬到記憶體中 --- 輸入 --- 讀
把記憶體中的資料放到其他裝置中 --- 輸出 --- 寫
3、流物質的定向移動,輸入輸出流中是資料的定向移動
輸入流的源頭: 檔案 目的地:記憶體
輸出流的源頭: 記憶體 目的地:檔案
4、標準輸出裝置 --- 顯示器
標準輸入裝置 --- 鍵盤
鍵盤 --- 記憶體 --- 顯示器
| |
輸入操作 輸出操作
輸入輸出流: 記憶體與磁碟之間,記憶體與標準輸入輸出裝置之間的
5、cout 源 :變數 目的地 :顯示器
cin 鍵盤 記憶體中某一變數
6、標準輸入流 cin istream的乙個物件
標準輸出流 cout ostream的乙個物件
標準錯誤流 cerr 目的地都是螢幕,用cout替代
7、cin
是乙個帶有緩衝的標準的輸入物件,預設輸入裝置是鍵盤
(1) >> : 自動校驗資料型別
遇到回車才會開始讀資料,遇到空格就結束,只能讀乙個單詞
流是資料的定向移動,被讀走的資料就消失,沒有讀走的資料會一直留在流中,直到流的消失,資料也跟著消失
流中有資料,就會阻塞,等待讀取 --- 所有輸入方法的特性
為什麼">>"可以連續使用?因為返回就是istream物件本身的引用
注意 :">>" 不讀回車,不讀空格
(2)get(): 每次讀乙個字元。返回乙個整數,實際上是讀到字元的ascii碼
把回車,空格都當作普通字元讀出來
(3)get(char&):把讀到的內容存到引數中
cin.get(arr[0]).get(arr[1]); //get(char&)返回cin本身,可以連續使用
(4)getline(str,256) : 讀取一行,包括空格
對於回車,唯讀走,不儲存
會讀取陣列長度減1個字元,最後乙個放'\0'
輸入資料超過給定的空間(1)截斷資料,剩下的資料還在流裡
(2)設定乙個錯誤標記,呼叫cin.clear(),清除錯誤,繼續工作
#include
using namespace std;
int main(){
int age;
char name[20] ;
cout << "enter your age>";
cin >> age;
cin.get(); //讀取流中殘餘的回車,以便getline能正常工作
// cin.ignore(20,'\n'); //忽略20個字元或者碰到回車,從流中清除
cout << "enter your name >";
cin.getline(name,20);
cout << "your age is :" << age << endl;
cout << "your name is :" << name << endl;
(5)read(char*,int) char*是存結果的位址,int是讀的長度,並且不能比前面的陣列的空間大
讀滿為止 ,特殊字元也當做普通字元處理
超出的部分仍然存在流裡面
只要資料沒讀滿,一直阻塞
不會自動補'\0' --- 傳引數的時候,陣列長度傳減1的長度,補齊'\0'以免亂碼
所有輸入流的共同特徵:只要沒資料就阻塞
讀不完的就留在流裡
(6)cin.ignore(255,'\n') 忽略255個字元或者遇到'\n',如果在前255個字元中出現'\n',則就忽略到'\n'之前的字元
(7)peek() 檢視流裡的第乙個字元是什麼
只察看,不讀走
(8)putback() 向流中插入字元,前提必須有空位的時候
必須與get()一起使用,用get()取出乙個字元,才能用putback()插入乙個字元
(9)cin.fail()判斷是否出現錯誤標誌,一切正常返回false
當用cin讀取的資料型別出現錯誤的時候,這是一種不可恢復的錯誤,用cin.clear()是不能清除錯誤標記的
在鍵盤上讀取,用getline()可以確保輸入流的正常形成,讀取後採取強制轉換型別得到自己需要的資料
8、ifstream
(1)需要#include 標頭檔案
ifstream ifs("test.txt"); //建立乙個ifstream的物件,開啟檔案,給建構函式傳如乙個引數,就是文要開啟的檔名
//檔案的在當前目錄下找,也可以用相對路徑或絕對路徑找檔案
在開啟檔案之後,立即判斷開啟檔案是否成功
if( ifs.fail() ){
cout << "can't open test " if( ! ifs ){ //也可以這樣判斷檔案開啟是否出錯
cout << "can't open test " (2)在檔案結束的時候都會有"eof"標誌,作為檔案結束的標誌符
可以用判斷是否讀到"eof",來判斷時候讀到檔案尾了
if(ifs.eof()){
break;
(3)對於乙個程序可開啟檔案的數量是有數的,所以檔案屬於資源
所以在使用完畢以後,要關閉檔案輸入流
練習:(1)把/etc/passwd 檔案列印出來
(2)把檔案中不以"#"開頭的內容讀出來
peek(),ignore()
9、輸出操作cout
(1) << 操作被輸出到螢幕上的東西,只所以能輸出,都是以字串型別輸出
也就是說這個操作有自動型別轉換的功能
(2)put() 返回cout引用,可以連續呼叫
(3)write(buf,len) 按指定長度寫到螢幕上 buf是char*型別
(4)cout.width(10); 列印的內容總共佔10個字元,並靠右對齊
只對其後邊的乙個cout生效
(5)cout.fill('#'); 用'#'補齊空位
主要呼叫一次,對以後的都生效
(6)setf()操作,控制格式,教材188頁
(7)特殊字元
'\r' 表示回退乙個格,再輸出
'\n' 回車
\\ 輸出乙個'\',因為'\'會被認為是轉義字元
'\t' 乙個tab鍵
(8)輸出控制符
oct 按八進位制輸出 「0」
dec 使進製輸出
hex 按十六進製制輸出 「0x」
flush 清空緩衝區 帶緩衝區是因為和外部裝置交涉,這樣能減少向螢幕輸出的次數,提高效率
回車、程式結束和flush都是重新整理快取的命令
cout << "a" <10、ofstream
開啟檔案,把資料寫進檔案,關閉檔案
ofstream ofs("ofstream.txt"); //開啟檔案,若檔案不存在,建立,存在,開啟
if(ofs.fail()){ //寫檔案失敗,一般是許可權問題
cout << "open file error " 疊加多個裝飾器 當乙個被裝飾的物件同時疊加多個裝飾器時 裝飾器的載入順序是 自下而上。迭代器 什麼是迭代器 迭代指的是乙個重複的過程,每一次重複都是基於上一次的結果而來的。迭代器指的是迭代取值的工具,該工具的特點是可以不依賴於索引取值。為何要用迭代器 為了找出一種通用的 可以不依賴於索引的迭代取值方... 編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the node with value 8 輸... 一.如果考慮相容最小高度的設定 了解 1.正常專案中 最小高度直接用min height即可。如果考慮相容 min height 在ie6不相容,ie6預設把height解析成最小高度。注 如果height 和 min height同是出現,執行height固定高度。2.最小高度的相容設定方法 了解...DAY13學習筆記
力扣學習筆記day13
前端學習Day13