程序設計實習概要剖析_第1頁
程序設計實習概要剖析_第2頁
程序設計實習概要剖析_第3頁
程序設計實習概要剖析_第4頁
程序設計實習概要剖析_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、程序設計實習概要剖析輸入輸出流輸入輸出流l流的概念模型lC+中與流操作相關的類及其繼承關系l輸入輸出流對象: cin, cout, cerr, clogl輸出流l輸入流l無格式輸入輸出l流操縱算子l流格式狀態(tài)流的概念模型流的概念模型l流 - 可以看作一個無限長的二進制數(shù)字序列l(wèi)通過讀寫指針進行流的讀和寫(以字節(jié)為單位) 1010111010101110將流上的數(shù)據(jù)讀進變量x1 0 1 0 1 1 1 011100010將y的值寫入流yx流的概念模型流的概念模型l輸出流 可以看作一端無限,另一端通過寫指針不停地向后寫入新內(nèi)容的單向流,1 1 00011010寫指針流的概念模型流的概念模型l輸入流

2、 可以看作一端無限,另一端通過讀指針不停地從流中讀取新內(nèi)容的單向流,讀出的內(nèi)容從流中刪去。1 1 00011010讀指針有格式讀寫和無格式讀寫有格式讀寫和無格式讀寫字符方式字符方式/二進制方式讀寫二進制方式讀寫l有格式讀寫,以某種數(shù)據(jù)類型為單位讀寫l例如:讀一個整數(shù),寫一個浮點數(shù)等;l無格式讀寫,以字節(jié)為單位讀寫,不區(qū)分其中的內(nèi)容l例如:讀20個字節(jié),寫50個字節(jié)等;緩沖區(qū)刷新緩沖區(qū)刷新l向輸出流中寫數(shù)據(jù)時,通常是先向緩沖區(qū)中寫,當緩沖區(qū)寫滿時,才真正向輸出流寫;也可以通過函數(shù)在程序中主動將緩沖區(qū)內(nèi)容寫入輸出流。C+C+中與流操作相關的類中與流操作相關的類及其繼承關系及其繼承關系iosistr

3、eamostreamifstreamiostreamofstreamfstream標準流對象標準流對象l輸入流對象: cin 與標準輸入設備相連l輸出流對象:cout 與標準輸出設備相連 cerr 與標準錯誤輸出設備相連 非緩沖輸出 clog 與標準錯誤輸出設備相連 緩沖輸出 輸出流輸出流l流插入運算符 cout “Good morning!n”; 不刷新緩沖區(qū) cout “Good”; 不刷新緩沖區(qū) cout “morning!”; 不刷新緩沖區(qū) cout endl; 刷新緩沖區(qū) cout 運算符的定義: istream &operator (istream &input, A & a) .

4、 return input; 返回的是輸入流的引用(引用本身是地址),在讀取不成功時, 該地址被置成 0. 所以可以用如下方法判輸入結束: int x; while(cinx) 輸入流輸入流l成員函數(shù) l三 讀入一個字符(包括空白字符), 返回該字符;lcin.get(char *buffer, int size,char delim=n )l 或者讀size 1 個字符入buffer,或者遇到n;l 在buffer最后加0,分隔符留在輸入流.lcin.getline(char *buffer, int size,char delim=n)l 或者讀size 1 個字符入buffer,或者遇到

5、n;l 在buffer最后加0, 分隔符從流去掉.l三 返回輸入是否結束標志.輸入流輸入流l其它函數(shù)l三; 返回下一個字符,但不從流中去掉.lputback(char ch); 將字符ch放回輸入流lignore( int nCount = 1, int delim = EOF );l 從流中刪掉最多nCount個字符,遇到EOF時結束。無格式輸入輸出無格式輸入輸出l用read, write 進行指定字節(jié)數(shù)的輸入輸出lconst int SIZE = 80;lchar bufferSIZE;lcin.read(buffer, 20);lcout.write(buffer, 三);l /gcou

6、nt返回上次讀入的字節(jié)數(shù)lcout endl;l輸入:Using the read,write and gcount member functions l輸出:Using the read,write流操縱算子流操縱算子l整數(shù)流的基數(shù):流操縱算子dec,oct,hex,setbasedec,oct,hex,setbasel浮點數(shù)的精度(precision,setprecision)l設置域?qū)?setw,width)l用戶自定義的流操縱算子使用流操縱算子需要 #include 流操縱算子流操縱算子l整數(shù)流的基數(shù):流操縱算子dec,oct,hexdec,oct,hex int n = 10; co

7、ut 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 main三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+006123456712 以小數(shù)點位置固

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

9、iosflags(ios:fixed) setprecision(6) x endl resetiosflags(ios:fixed) setw(5); 或者 cin.width(5);cout string) 90 while(cin string) 90 cout.width(w+); cout.width(w+); cout string endl; cout string string; 567890 cout string string; cout string string; 5678 cout string string; cout string endl; 用戶自定義流操縱算子

10、用戶自定義流操縱算子ostream &tab(ostream &output) return output t;cout “aa” tab “bb” endl;輸出:aa bb為什么可以?用戶自定義流操縱算子用戶自定義流操縱算子因為 iostream 里對 進行了重載(成員函數(shù))ostream & operator ( ostream & ( * p ) ( ostream & ) ) ;文件操作文件操作l數(shù)據(jù)的層次l文件和流l建立順序文件l文件的讀寫指針l有格式讀寫l無格式讀寫數(shù)據(jù)的層次數(shù)據(jù)的層次l位 bitl字節(jié) bytel域/記錄例如:學生記錄 int ID; char name10;

11、int age; int rank10;l我們將所有記錄順序地寫入一個文件,稱為順序文件。 文件和流文件和流l可以將順序文件看作一個有限字符構成的順序字符流,然后象對cin, cout 一樣的讀寫。回顧一下輸入輸出流類的結構層次:iosistreamostreamifstreamiostreamofstreamfstream建立順序文件建立順序文件l#include / 包含頭文件lofstream ”, ios:out|ios:binary); /打開文件lofstream 是是 fstream中定義的類中定義的類loutFile 是我們定義的是我們定義的ofstream類的對象類的對象l“

12、”是將要建立的文件的文件名是將要建立的文件的文件名lios:out 是打開并建立文件的選項是打開并建立文件的選項lios:out 輸出到文件輸出到文件, 刪除原有內(nèi)容刪除原有內(nèi)容lios:app 輸出到文件輸出到文件, 保留原有內(nèi)容,總是在尾部添加保留原有內(nèi)容,總是在尾部添加lios:ate 輸出到文件輸出到文件, 保留原有內(nèi)容,可以在文件任意位置添加保留原有內(nèi)容,可以在文件任意位置添加 lios:binary 以二進制文件格式打開文件建立順序文件建立順序文件l也可以先創(chuàng)建ofstream對象,再用 open函數(shù)打開 ofstream fout; fout.open(test.out,ios:

13、out|ios:binary);l判斷打開是否成功: if(!fout)cerr “File open error!”endl;文件的讀寫指針文件的讀寫指針l對于輸入文件,有一個讀指針;l對于輸出文件,有一個寫指針;l對于輸入輸出文件,有一個讀寫指針;l標識文件操作的當前位置, 該指針在哪里,讀寫操作就在哪里進行。文件的讀寫指針文件的讀寫指針lofstream fout(“a1.out”,ios:ate);llong location = fout.tellp三; l /取得寫指針的位置llocation = 10L;lfout.seekp(location); l / 將寫指針移動到第10個

14、字節(jié)處lfout.seekp(location,ios:beg); /從頭數(shù)locationlfout.seekp(location,ios:cur); /從當前位置數(shù)locationlfout.seekp(location,ios:end); /從尾部數(shù)locationllocation 可以為負值文件的讀寫指針文件的讀寫指針lifstream fin(“a1.in”,ios:ate);llong location = fin.tellg三; l /取得讀指針的位置llocation = 10L;lfin.seekg(location); l / 將讀指針移動到第10個字節(jié)處lfin.see

15、kg(location,ios:beg); /從頭數(shù)locationlfin.seekg(location,ios:cur); /從當前位置數(shù)locationlfin.seekg(location,ios:end); /從尾部數(shù)locationllocation 可以為負值字符文件讀寫字符文件讀寫因為文件流也是流,所以前面講過的流的成員函數(shù)和流操作算子也同樣適用于文件流。寫一個程序,將文件 里面的整數(shù)排序后,輸出到例如,若 的內(nèi)容為:1 234 9 45 6 879則執(zhí)行本程序后,生成的的內(nèi)容為:1 6 9 45 234 879#include #include #include using

16、namespace std;int cmp(const void * x1, const void *x2) return *(int *)x1) - *(int *)x2); int 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 ;三;三;參考程序二進制

17、文件讀寫二進制文件讀寫lint x=10;lfout.seekp(20, ios:beg);lfout.write(const char *)(&x),sizeof(int);lfin.seekg(0, ios:beg);lfin.read(char *)(&x),sizeof(int);l二進制文件讀寫,直接寫二進制數(shù)據(jù),記事本看未必正確。二進制文件讀寫,直接寫二進制數(shù)據(jù),記事本看未必正確。二進制文件讀寫二進制文件讀寫/下面的程序從鍵盤輸入幾個學生的姓名的成績,并以二進制/文件形式存起來#include #include using namespace std;class CStudent

18、public:char szName20;int nScore;int main三CStudent s;ofstream OutFile( ,ios:out|ios:binary);while( cin ) if( stricmp(s.szName,“exit”) = 0) /名字為exit則結束break;OutFile.write(char * ) & s, sizeof( s);三;return 0;輸入: Tom 60Jack 80Jane 40exit 0則形成的 為 72字節(jié),用 記事本打開,呈現(xiàn):Tom 燙燙燙燙燙燙燙燙 Jack 燙燙燙燙燙燙燙蘌 Jane 燙燙燙燙燙燙燙?二進

19、制文件讀寫二進制文件讀寫/下面的程序?qū)?文件的內(nèi)容讀出并顯示#include #include using namespace std;class CStudent 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( ( (char* ) & s, sizeof(s) ) int nReadedBytes = 三; /看剛才讀了多少字節(jié)cout

20、 endl;三;return 0; 輸出:Tom 60Jack 80Jane 40二進制文件讀寫二進制文件讀寫/下面的程序?qū)?文件的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;( 2 * sizeof(s),ios:beg);/定位寫指針到第三個記錄iofile.write(Mike,strlen(Mike);iofile.seekp(0,ios:beg); /定位讀指針到開頭while( ( (char* ) & s, sizeof(s) ) cout settings-debug -program argumen

溫馨提示

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

評論

0/150

提交評論