1、流的控制
iomanip 在使用格式化I/O時應包含此標頭檔案。
stdiostream 用於混合使用C和C + +的I/O機制時,例如想將C程式轉變為C++程式
2、類繼承關係
ios是抽象基類,由它派生出istream類和ostream類, iostream類支援輸入輸出操作,iostream類是從istream類和ostream類通過多重繼承而派生的類
類ifstream繼承了類istream,類ofstream繼承了類ostream,類fstream繼承了 類iostream
iostream標頭檔案中4種流物件
物件 | 含義 | 對應裝置 |
對應的類 |
c語言中相應的標準檔案 |
cin | 標準輸入流 | 鍵盤 | istream_withassign | stdin |
cout | 標準輸出流 | 螢幕 | ostream_withassign | stdout |
cerr | 標準錯誤流 | 螢幕 | ostream_withassign | stderr |
clog | 標準錯誤流 | 螢幕 | ostream_withassign | stderr |
cout補充
1、用“cout<<”輸出基本型別的資料時,可以不必考慮資料是什麼型別,系統會判斷資料的型別
並根據其型別選擇呼叫與之匹配的運算子過載函式。這個過程都是自動的,使用者不必干預。
如果在C語言中用prinf函式輸出不同型別的資料,必須分別指定相應的輸出格式符,十分麻煩,而且容易出錯
2、cout流在記憶體中對應開闢了一個緩衝區,用來存放流中的資料,當向cout流插 人一個endl時,
不論緩衝區是否已滿,都立即輸出流中所有資料,然後插入一個換行符, 並重新整理流(清空緩衝區)。
注意如果插人一個換行符”\n“(如cout<<a<<“\n”),則只輸出和換行,而不重新整理cout 流(但並不是所有編譯系統都體現出這一區別)。
3、在iostream中只對”<<“和”>>”運算子用於標準型別資料的輸入輸出進行了過載,但未對使用者宣告的型別資料的輸入輸出 進行過載。
如果使用者宣告瞭新的型別,並希望用”<<“和”>>”運算子對其進行輸入輸出,按照重運算子過載來做。
cout 流通常是傳送到顯示器輸出,但也可以被重定向 輸出到磁碟檔案,而cerr流中的資訊只能在顯示器輸出
cerr是不經過緩衝區,直接向顯示器上輸出有關資訊,而clog中的資訊存放在緩衝區中,緩衝區滿後或遇endl時向顯示器輸出
3、標準輸入流 cin
重點掌握的函式
cin.get() //讀入一個字元並返回它的值
cin.get(一個引數) //讀入一個字元並把它儲存在ch
cin.get(兩個引數) //可以讀取字串
cin.get(三個引數) //可以讀字串
cin.getline()
cin.ignore() //讀取字元並忽略指定字元
cin.peek() //檢查下一個輸入的字元,不會把字元從流中移除
cin.putback() //返回一個字元給一個流
重要
1、使用cin,從流中讀出的字元,流中就沒有這字元了,再次讀取時只能讀取剩下的
2、緩衝去只有在遇到EOF、手動敲回車、流(快取區)滿時,才將流中的字元全部讀出(即清空快取區)
練習
1、從流中取一個字元,然後在放進去;
2、判斷流中的第一個字元是不是放進去的那個字元;
3、從流中讀取10個字元;
4、從流中忽略5個字元,再讀取10個字元;
5、最後讀取剩下的字元,最後輸出讀到的所有字元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream> using namespace std; int main() { char ch1; int look; char str1[11] = {0}; char str2[11] = {0}; char str3[100] = {0}; //從流中取一個字元,然後在放進去 ch1 = cin.get(); cin.putback(ch1); //判斷流中的第一個字元是不是放進去的那個字元 look = cin.peek(); if(look == (int)ch1) { cout<<"cin.peek()放進去的字元在第一個位置"<<endl; } else { cout<<"cin.peek()放進去的字元不是在第一個位置"<<endl; } //從流中讀取10個字元 cin.get(str1,11); //從流中忽略5個字元,再讀取10個字元 cin.ignore(5); cin.get(str2,11,EOF); //最後讀取剩下的字元,最後輸出讀到的所有字元 cin.getline(str3,100); //輸出讀到的資料 cout<<"第一個字元"<<ch1<<endl; cout<<"第一組 字串:"<<str1<<endl; cout<<"第二組 字串:"<<str2<<endl; cout<<"剩下的字串:"<<str3<<endl; system("pause"); return 0; } |
輸出:
1 2 3 4 5 6 |
0123456789abcde9876543210zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy cin.peek()放進去的字元在第一個位置 第一個字元0 第一組 字串:0123456789 第二組 字串:9876543210 剩下的字串:zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy |
4、標準輸出流 cout
流成員函式
cout.flush() //清空緩衝區
cout.put() //把字元寫入流中
cout.write() //將字串寫入當前輸出流中
eg : cout.setf( ios::dec );
cout.setf(ios::hex,ios::basefield);【建議使用這種】
需注意:
1、fmtflags setf( fmtflags flags ); 使用這種,一定要先取消當前基【cout.unself()】,之後才可以設定新的基
2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用這種,第二個引數設為當前的基,或者當不知道當前基時,設為ios_base::basefield清除當前的所有可能的基
控制符,標頭檔案<iomanip>
eg: cout<<setw(5);
5、檔案I/O
由於檔案裝置並不像顯示器螢幕與鍵盤那樣是標準預設裝置,不能像cout那樣預先定義的全域性物件,所以我們必須自己定義一個該類的物件。
ifstream類,它是從istream類派生的,用來支援從磁碟檔案的輸入。
ofstream類,它是從ostream類派生的,用來支援向磁碟檔案的輸出。
fstream類,它是從iostream類派生的,用來支援對磁碟檔案的輸入輸出。
檔案原理
檔案開啟都有一個檔案指標,該指標的初始位置由I/O方式指定,每次讀寫都從檔案指標的當前位置開始。每讀入一個位元組,指標就後移一個位元組。當檔案指標移到最後,就會遇到檔案結束EOF(檔案結束符也佔一個位元組,其值為-1),此時流物件的成員函式eof的值為非0值(一般設為1),表示檔案結束 了。
檔案關閉,實際上是解除該磁碟檔案與檔案流的關聯,原來設定的工作方式也失效,這樣,就不能再通過檔案流對該檔案進行輸入或輸出
檔案型別:
1、ASCII檔案:檔案的每一個位元組中均以ASCII程式碼形式存放資料,即一個位元組存放一個字元,這個檔案就是ASCII檔案(或稱字元檔案)。
2、二進位制檔案:檔案中的資訊不是字元資料,而是位元組中的二進位制形式的資訊,因此它又稱為位元組檔案
常用函式
開啟檔案:
方式1:對檔案輸出流、檔案流物件,通過ofstream類的建構函式開啟檔案
格式: ofstream (磁碟檔名, 輸入輸出方式);
如果ofstream 為0(假),表示開啟操作失敗
如: ofstream fout1(fname,ios::out);
輸入輸出方式可以使用能夠進行組合使用的,以“或”運算(“|”)的方式,如:fstream fout(fname,ios::out|ios::in)
方式2:對檔案的輸出和輸入流物件、檔案流物件,都可通過open函式開啟檔案
格式: 檔案流物件.open(磁碟檔名, 輸入輸出方式);
返回值:為0(假),開啟操作失敗
如: fout.open(fname,ios::out)
關閉檔案:
在對已開啟的磁碟檔案的讀寫操作完成後,必須要關閉該檔案 如: outfile.close( );
檔案操作
1、可以用流插入運算子“<<”和流提取運算子“>>”輸入輸出標準型別的資料(>> 讀出時在遇空格、換行都結束)。
2、也可以用檔案流的put、get、geiline等成員函式進行字元的輸入輸出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include <iostream> using namespace std; #include "fstream" int main() { char fname[] = "d:/file1.txt"; char buff[1024]= {0}; /*********** 寫檔案 *************/ //方式1 輸出流ofstream物件呼叫fopen函式 ofstream fout; fout.open(fname,ios::out); if(!fout) { cout<<"開啟檔案失敗"<<fname<<endl; } fout<< "hello world !"; //通過左移運算子寫入字串 fout.flush(); fout.close(); //方式2 呼叫輸出流ofstream物件的建構函式 ofstream fout1(fname,ios::out); if(!fout1) { cout<<"開啟檔案失敗"<<fname<<endl; } fout1.put('h'); //通過put函式寫入字元 fout1.put('e'); fout1.put('l'); fout1.put('l'); fout1.put('o'); fout1.put('\n'); fout1.flush(); fout1.close(); //檔案流物件寫檔案 fstream file2(fname,ios::in|ios::out); file2<<"abdfd\n"; file2<<"11111\n"; file2.flush(); file2.close(); /*********** 讀檔案 *************/ //輸入流ifstream物件讀取檔案內容 ifstream fin; fin.open(fname,ios::in); fin.getline(buff,1024); //通過getline函式讀取字串 cout<<buff<<endl; fin.close(); //檔案流物件讀檔案內容 fstream file1(fname,ios::in|ios::out); file1>>buff; //通過右移運算子讀出字串 file1.close(); cout<<buff<<endl; system("pause"); return 0; } |
二進位制檔案操作
對二進位制檔案的讀寫主要用istream類的成員函式read和write來實現。這兩個成員函式的原型為
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <iostream> using namespace std; #include <fstream> class Teacher { public: Teacher() { } Teacher(int age,char name[20]) { this->age = age; strcpy(this->name,name); } void prinfInfo() { cout<<"Teacher name:"<<this->name<<" age:"<<this->age<<endl; } private: int age; char name[20]; }; int main() { Teacher t1(31,"xiaoming"); Teacher t2(32,"xiaohong"); Teacher t3(33,"xiaohua"); Teacher t4(34,"xiaoxin"); char fname[] = "d:/file2"; fstream fs(fname,ios::binary|ios::out); if(!fs) { cout<<"檔案開啟失敗"<<endl; } fs.write((char *)&t1,sizeof(Teacher)); fs.write((char *)&t2,sizeof(Teacher)); fs.write((char *)&t3,sizeof(Teacher)); fs.write((char *)&t4,sizeof(Teacher)); fs.flush(); fs.close(); fstream fs2(fname,ios::binary|ios::in); if(!fs) { cout<<"檔案開啟失敗"<<endl; } Teacher tt; fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.close(); system("pause"); return 0; } |
輸出:
1 2 3 4 |
Teacher name:xiaoming age:31 Teacher name:xiaohong age:32 Teacher name:xiaohua age:33 Teacher name:xiaoxin age:34 |
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!