程序設(shè)計原理輸入輸出流和文件操作_第1頁
程序設(shè)計原理輸入輸出流和文件操作_第2頁
程序設(shè)計原理輸入輸出流和文件操作_第3頁
程序設(shè)計原理輸入輸出流和文件操作_第4頁
程序設(shè)計原理輸入輸出流和文件操作_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、程序設(shè)計原理輸入輸出流和文件操作輸入輸出流流的概念模型C+中與流操作相關(guān)的類及其繼承關(guān)系輸入輸出流對象: cin, cout, cerr, clog輸出流輸入流無格式輸入輸出流操縱算子流格式狀態(tài)流的概念模型流 - 可以看作一個無限長的二進(jìn)制數(shù)字序列通過讀寫指針進(jìn)行流的讀和寫(以字節(jié)為單位) 1010111010101110將流上的數(shù)據(jù)讀進(jìn)變量x1010111011100010將y的值寫入流yx流的概念模型輸出流 可以看作一端無限,另一端通過寫指針不停地向后寫入新內(nèi)容的單向流,1100011010寫指針流的概念模型輸入流 可以看作一端無限,另一端通過讀指針不停地從流中讀取新內(nèi)容的單向流,讀出的內(nèi)

2、容從流中刪去。1100011010讀指針有格式讀寫和無格式讀寫字符方式/二進(jìn)制方式讀寫有格式讀寫,以某種數(shù)據(jù)類型為單位讀寫例如:讀一個整數(shù),寫一個浮點數(shù)等;無格式讀寫,以字節(jié)為單位讀寫,不區(qū)分其中的內(nèi)容例如:讀20個字節(jié),寫50個字節(jié)等;緩沖區(qū)刷新向輸出流中寫數(shù)據(jù)時,通常是先向緩沖區(qū)中寫,當(dāng)緩沖區(qū)寫滿時,才真正向輸出流寫;也可以通過函數(shù)在程序中主動將緩沖區(qū)內(nèi)容寫入輸出流。C+中與流操作相關(guān)的類及其繼承關(guān)系iosistreamostreamifstreamiostreamofstreamfstream標(biāo)準(zhǔn)流對象輸入流對象: cin 與標(biāo)準(zhǔn)輸入設(shè)備相連輸出流對象:cout 與標(biāo)準(zhǔn)輸出設(shè)備相連 ce

3、rr 與標(biāo)準(zhǔn)錯誤輸出設(shè)備相連 非緩沖輸出 clog 與標(biāo)準(zhǔn)錯誤輸出設(shè)備相連 緩沖輸出 輸出流流插入運算符 cout “Good morning!n”; 不刷新緩沖區(qū) cout “Good”; 不刷新緩沖區(qū) cout “morning!”; 不刷新緩沖區(qū) cout endl; 刷新緩沖區(qū) cout 運算符的定義: istream &operator (istream &input, A & a) . return input; 返回的是輸入流的引用(引用本身是地址),在讀取不成功時, 該地址被置成 0. 所以可以用如下方法判輸入結(jié)束: int x; while(cinx) 輸入流成員函數(shù) cin

4、.get() 讀入一個字符(包括空白字符), 返回該字符;cin.get(char *buffer, int size,char delim=n ) 或者讀size 1 個字符入buffer,或者遇到n; 在buffer最后加0,分隔符留在輸入流.cin.getline(char *buffer, int size,char delim=n) 或者讀size 1 個字符入buffer,或者遇到n; 在buffer最后加0, 分隔符從流去掉.cin.eof() 返回輸入是否結(jié)束標(biāo)志.輸入流其它函數(shù)cin.peek(); 返回下一個字符,但不從流中去掉.putback(char ch); 將字符c

5、h放回輸入流ignore( int nCount = 1, int delim = EOF ); 從流中刪掉最多nCount個字符,遇到EOF時結(jié)束。無格式輸入輸出用read, write 進(jìn)行指定字節(jié)數(shù)的輸入輸出const int SIZE = 80;char bufferSIZE;cin.read(buffer, 20);cout.write(buffer, cin.gcount(); /gcount返回上次讀入的字節(jié)數(shù)cout endl;輸入:Using the read,write and gcount member functions 輸出:Using the read,write流

6、操縱算子整數(shù)流的基數(shù):流操縱算子dec,oct,hex,setbase浮點數(shù)的精度(precision,setprecision)設(shè)置域?qū)?setw,width)用戶自定義的流操縱算子使用流操縱算子需要 #include 流操縱算子整數(shù)流的基數(shù):流操縱算子dec,oct,hex int n = 10; cout n endl; cout hex n “n” dec n “n” oct n setprecision(5); / 可以連續(xù)輸出它們的功能相同。指定輸出浮點數(shù)的有效位數(shù) 浮點數(shù)輸出最多6位有效數(shù)字#include #include using namespace std;int mai

7、n()double x = 1234567.89,y = 12.34567;int n = 1234567;int m = 12;cout setprecision(6) x endl y endl n endl m; 控制浮點數(shù)精度的流操縱算子輸出:1.23457e+00612 以小數(shù)點位置固定的方式輸出#include #include using namespace std;int main()double x = 1234567.89,y = 12.34567;int n = 1234567;int m = 12;cout setiosflags(ios:fixed) setpreci

8、sion(6) x endl y endl n endl m;控制浮點數(shù)精度的流操縱算子輸出:12 取消以小數(shù)點位置固定的方式輸出#include #include using namespace std;int main()double x = 1234567.89;cout setiosflags(ios:fixed) setprecision(6) x endl resetiosflags(ios:fixed) setw(5); 或者 cin.width(5);cout string) 90 cout.width(w+); cout string string; 567890 cout

9、string string; cout string string; 5678 cout string string; cout string endl; 用戶自定義流操縱算子ostream &tab(ostream &output) return output t;cout “aa” tab “bb” endl;輸出:aa bb為什么可以?用戶自定義流操縱算子因為 iostream 里對 進(jìn)行了重載(成員函數(shù))ostream & operator ( ostream & ( * p ) ( ostream & ) ) ;文件操作數(shù)據(jù)的層次文件和流建立順序文件文件的讀寫指針有格式讀寫無格式讀寫

10、數(shù)據(jù)的層次位 bit字節(jié) byte域/記錄例如:學(xué)生記錄 int ID; char name10; int age; int rank10;我們將所有記錄順序地寫入一個文件,稱為順序文件。 文件和流可以將順序文件看作一個有限字符構(gòu)成的順序字符流,然后象對cin, cout 一樣的讀寫?;仡櫼幌螺斎胼敵隽黝惖慕Y(jié)構(gòu)層次:iosistreamostreamifstreamiostreamofstreamfstream建立順序文件#include / 包含頭文件ofstream outFile(“clients.dat”, ios:out|ios:binary); /打開文件ofstream 是 fs

11、tream中定義的類outFile 是我們定義的ofstream類的對象“clients.dat”是將要建立的文件的文件名ios:out 是打開并建立文件的選項ios:out 輸出到文件, 刪除原有內(nèi)容ios:app 輸出到文件, 保留原有內(nèi)容,總是在尾部添加ios:ate 輸出到文件, 保留原有內(nèi)容,可以在文件任意位置添加 ios:binary 以二進(jìn)制文件格式打開文件建立順序文件也可以先創(chuàng)建ofstream對象,再用 open函數(shù)打開 ofstream fout; fout.open(test.out,ios:out|ios:binary);判斷打開是否成功: if(!fout)cerr

12、“ error!”endl;文件的讀寫指針對于輸入文件,有一個讀指針;對于輸出文件,有一個寫指針;對于輸入輸出文件,有一個讀寫指針;標(biāo)識文件操作的當(dāng)前位置, 該指針在哪里,讀寫操作就在哪里進(jìn)行。文件的讀寫指針ofstream fout(“a1.out”,ios:ate);long location = fout.tellp(); /取得寫指針的位置location = 10L;fout.seekp(location); / 將寫指針移動到第10個字節(jié)處fout.seekp(location,ios:beg); /從頭數(shù)locationfout.seekp(location,ios:cur);

13、/從當(dāng)前位置數(shù)locationfout.seekp(location,ios:end); /從尾部數(shù)locationlocation 可以為負(fù)值文件的讀寫指針ifstream fin(“a1.in”,ios:ate);long location = fin.tellg(); /取得讀指針的位置location = 10L;fin.seekg(location); / 將讀指針移動到第10個字節(jié)處fin.seekg(location,ios:beg); /從頭數(shù)locationfin.seekg(location,ios:cur); /從當(dāng)前位置數(shù)locationfin.seekg(locati

14、on,ios:end); /從尾部數(shù)locationlocation 可以為負(fù)值字符文件讀寫因為文件流也是流,所以前面講過的流的成員函數(shù)和流操作算子也同樣適用于文件流。寫一個程序,將文件 in.txt 里面的整數(shù)排序后,輸出到例如,若in.txt 的內(nèi)容為:1 234 9 45 6 879則執(zhí)行本程序后,生成的的內(nèi)容為:1 6 9 45 234 879#include #include #include using namespace std;int cmp(const void * x1, const void *x2) return *(int *)x1) - *(int *)x2); i

15、nt main() int v100, int i = 0 , x;ifstream srcFile(in.txt,ios:in);ofstream destFile(out.txt,ios:out);while( srcFile x ) vi = x; i+; qsort(v,i, sizeof(int), cmp);for( int j = 0; j i; j + )destFile vj ;dest();src();參考程序二進(jìn)制文件讀寫int x=10;fout.seekp(20, ios:beg);fout.write(const char *)(&x),sizeof(int);fi

16、n.seekg(0, ios:beg);fin.read(char *)(&x),sizeof(int);二進(jìn)制文件讀寫,直接寫二進(jìn)制數(shù)據(jù),記事本看未必正確。二進(jìn)制文件讀寫/下面的程序從鍵盤輸入幾個學(xué)生的姓名的成績,并以二進(jìn)制/文件形式存起來#include #include using namespace std;class CStudent public:char szName20;int nScore;int main()CStudent s;ofstream OutFile( c:tmpstudents.dat,ios:out|ios:binary);while( cin s.szNa

17、me s.nScore ) if( stricmp(s.szName,“exit”) = 0) /名字為exit則結(jié)束break;Out(char * ) & s, sizeof( s);Out();return 0;輸入: Tom 60Jack 80Jane 40exit 0則形成的 students.dat 為 72字節(jié),用 記事本打開,呈現(xiàn):Tom 燙燙燙燙燙燙燙燙 Jack 燙燙燙燙燙燙燙蘌 Jane 燙燙燙燙燙燙燙?二進(jìn)制文件讀寫/下面的程序?qū)?students.dat 文件的內(nèi)容讀出并顯示#include #include using namespace std;class CSt

18、udent public:char szName20;int nScore;int main()CStudent s;ifstream InFile(“c:tmpstudents.dat”,ios:in | ios:binary);if(!InFile) cout error endl;return 0;while( In( (char* ) & s, sizeof(s) ) int nReadedBytes = In(); /看剛才讀了多少字節(jié)cout s.szName s.nScore endl;In();return 0; 輸出:Tom 60Jack 80Jane 40二進(jìn)制文件讀寫/下

19、面的程序?qū)?students.dat 文件的Jane的名字改成Mike#include #include using namespace std;class CStudent public:char szName20;int nScore;輸出:Tom 60Jack 80Mike 40int main()CStudent s;fstream iofile( c:tmpstudents.dat,ios:in|ios:out | ios:binary);if( !iofile) cout error ;return 0;io( 2 * sizeof(s),ios:beg);/定位寫指針到第三個記錄io(Mike,strlen(Mike);io(0,ios:beg); /定位讀指針到開頭while( io( (char* ) & s, sizeof(s) ) cout s.szName s.nScore settings-debug -program arguments命令行參數(shù)int mai

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論