版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第2323章章 輸入與輸出流輸入與輸出流提綱提綱l輸出流和輸入流的常用成員函數(shù)l流操縱符l流的錯誤狀態(tài)l文件和流l文件操作打開文件打開文件讀讀 / / 寫文件寫文件關閉文件關閉文件23.1 C+的輸入和輸出(I/O)n 輸入和輸出,要看以什么為對象 n 以標準I/O設備為對象n從鍵盤、鼠標得到的數(shù)據(jù)是進入從鍵盤、鼠標得到的數(shù)據(jù)是進入內存內存的,該數(shù)據(jù)是輸入數(shù)據(jù)。的,該數(shù)據(jù)是輸入數(shù)據(jù)。n將數(shù)據(jù)從將數(shù)據(jù)從內存內存送到顯示器、打印機等,該數(shù)據(jù)是輸出數(shù)據(jù)。送到顯示器、打印機等,該數(shù)據(jù)是輸出數(shù)據(jù)。n 以外存磁盤文件為對象n內存中的數(shù)據(jù)內存中的數(shù)據(jù)存儲到磁盤文件中,叫輸出文件;存儲到磁盤文件中,叫輸出文
2、件;n從磁盤文件中的數(shù)據(jù)裝載入從磁盤文件中的數(shù)據(jù)裝載入內存中內存中,叫輸入文件。,叫輸入文件。n 以內存中指定的空間作為對象n常指定一個字符數(shù)組作為存儲空間,這種常指定一個字符數(shù)組作為存儲空間,這種I/O稱為字符串的輸入稱為字符串的輸入輸出。輸出。n C+采取不同的方法實現(xiàn)以上三種采取不同的方法實現(xiàn)以上三種I/O。標準標準I/O文件文件I/O串串I/On數(shù)據(jù)之間的傳輸過程稱作流(stream)n 輸入流輸入流表示數(shù)據(jù)從某個載體或設備傳送到表示數(shù)據(jù)從某個載體或設備傳送到內存內存n 輸出流輸出流表示數(shù)據(jù)從內存?zhèn)魉偷侥硞€載體或表示數(shù)據(jù)從內存?zhèn)魉偷侥硞€載體或設備設備C+的輸入輸出流內內存存鍵盤鍵盤文件
3、文件光筆光筆.輸入流輸入流顯示器顯示器文件文件打印機打印機.輸出流輸出流n在進行I/O操作時n 首先進行首先進行“打開打開”操作,使流和文件發(fā)生聯(lián)系操作,使流和文件發(fā)生聯(lián)系n 建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出n I/O結束后,使用結束后,使用“關閉關閉”操作使文件與流斷開聯(lián)系。操作使文件與流斷開聯(lián)系。nC+將I/O流定義為類流類。屬于流類的對象是流對象n 系統(tǒng)已經(jīng)以系統(tǒng)已經(jīng)以運算符或函數(shù)運算符或函數(shù)的形式做好了對標準外設的形式做好了對標準外設(鍵盤、顯示器、打印機、鍵盤、顯示器、打印機、文件文件)的接口,使用時只需的接口,使用時只需按照要求的格式調用即可
4、。按照要求的格式調用即可。n 如:如:cin 標準輸入流對象。標準輸入流對象。 cout 標準輸出流對象。標準輸出流對象。C+的輸入輸出流I/OI/O流模板層次部分流模板層次部分C+的各種I/O流類庫nC+為實現(xiàn)數(shù)據(jù)的I/O定義了一個龐大的類庫。它包括的類主要有輸出char *變量的地址值lchar * p=“asd”;lcoutpendl;lcoutstatic_cast(p);輸入和輸出流對象輸入和輸出流對象l預先定義的輸出和輸入流對象:cout 標準輸出cerr 標準錯誤輸出,沒有緩沖,發(fā)送給它的內容立即被輸出。clog 類似于cerr,但是有緩沖,緩沖區(qū)滿時被輸出。cin標準輸入23.
5、2 標準輸出流 n標準輸出流流向標準輸出設備(顯示器)的數(shù)據(jù) ncout流對象在控制臺(顯示器)輸出n 用用流插入運算符流插入運算符“”向向cout輸出數(shù)據(jù)輸出數(shù)據(jù).n 如: cout “a=” a endl; cout 數(shù)據(jù)數(shù)據(jù)1 數(shù)據(jù)數(shù)據(jù)2 數(shù)據(jù)數(shù)據(jù)3;ncerr流對象在控制臺(顯示器)輸出錯誤信息n 用用流插入運算符流插入運算符“”向向cerr輸出數(shù)據(jù)輸出數(shù)據(jù).n 如: cerr “除數(shù)為除數(shù)為0, 出錯出錯!” endl; cerr的用法與的用法與cout類似類似.ncout流對象與cerr流對象的不同之處n cout的輸出默認是顯示器的輸出默認是顯示器,但可以被重定向為輸出到磁盤但可
6、以被重定向為輸出到磁盤文件文件n cerr只能定向輸出到顯示器只能定向輸出到顯示器 例23.1 解一元二次方程ax2+bx+c=0 的解void main( ) float a, b, c, disc; cout a b c; if (a=0) cerr “ a=0, 不是二次方程,出錯!不是二次方程,出錯!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程無實根。二次方程無實根?!眅ndl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2*a)endl; 標準
7、輸出流n 標準輸出流流向標準輸出設備(顯示器)的數(shù)據(jù)n clog流對象在控制臺(顯示器)輸出錯誤信息.n 用用流插入運算符流插入運算符“”向向clog輸出數(shù)據(jù)輸出數(shù)據(jù).n 如如: clog “除數(shù)為除數(shù)為0, 出錯出錯!” endl;n clog的用法與的用法與cerr類似類似.n clog流對象與cerr流對象的不同之處n cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關信息。是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關信息。n clog的輸出先存儲在緩沖區(qū),遇到緩沖區(qū)滿或遇到的輸出先存儲在緩沖區(qū),遇到緩沖區(qū)滿或遇到endl時才向顯時才向顯示器輸出。示器輸出。用流對象的成員控制格式輸出說明:cout.w
8、idth(n) 與格式控制符與格式控制符setw(n)相似相似cout.fill(c) 與格式控制符與格式控制符setfill(c)相似相似cout.setf(ios:dec); cout.unsetf(ios:hex);/#include using namespace std;int main()int a=21; cout.setf(ios:showbase); coutdec:aendl; cout.unsetf(ios:dec); cout.setf(ios:hex); couthex:aendl; cout.unsetf(ios:hex); cout.setf(ios:oct);
9、coutoct:aendl; char *pt=China; cout.width(10); coutptendl; cout.width(10); cout.fill(*); coutptendl; double pi=22.0/7.0; cout.setf(ios:scientific); coutpi=; cout.width(14); coutpiendl; cout.unsetf(ios:scientific); cout.setf(ios:fixed); cout.width(12); cout.setf(ios:showpos); cout.setf(ios:internal);
10、 cout.precision(6); coutpiab; / 從鍵盤輸入2個整數(shù)n當輸入時n 遇到無效的字符遇到無效的字符n 或遇到文件結束符或遇到文件結束符 ctrl+z 時時 cin處于出錯狀態(tài),無法正常提取數(shù)據(jù)(cin=false). if (!cin) cout“輸入出錯輸入出錯”;21 abc #include using namespace std;int main( )float grade; coutgrade) /能從cin流讀取數(shù)據(jù)if(grade=85) coutgradeGOOD!endl;if(grade60) coutgradefail!endl;coutente
11、r grade:; coutThe end.endl; return 0;函數(shù)函數(shù)功能功能read無格式輸入指定字節(jié)數(shù)無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格從流中提取字符,包括空格getline從流中提取一行字符從流中提取一行字符ignore提取并丟棄流中指定字符提取并丟棄流中指定字符peek返回流中下一個字符,但不從流中刪除返回流中下一個字符,但不從流中刪除gcount統(tǒng)計最后輸入的字符個數(shù)統(tǒng)計最后輸入的字符個數(shù)eatwhite忽略前導空格忽略前導空格seekg移動輸入流指針移動輸入流指針tellg返回輸入流中指定位置的指針值返回輸入流中指定位置的指針值istreamistrea
12、m類的公有成員函數(shù)類的公有成員函數(shù) 輸出流和輸入流的常用成員函數(shù)輸出流和輸入流的常用成員函數(shù)int get();istream& get( char& rch );istream& get( char* pch, int nCount, char delim = n );istream& read ( char* pch, int nCount );讀取一個字符讀取一個字符,不跳過空白字符不跳過空白字符讀取一行字符,讀取一行字符,不提取不提取n函數(shù)函數(shù)功能功能read無格式輸入指定字節(jié)數(shù)無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一
13、行字符ignore提取并丟棄流中指定字符提取并丟棄流中指定字符peek返回流中下一個字符,但不從流中刪除gcount統(tǒng)計最后輸入的字符個數(shù)統(tǒng)計最后輸入的字符個數(shù)eatwhite忽略前導空格seekg移動輸入流指針tellg返回輸入流中指定位置的指針值istream& ignore( int nCount = 1, int delim = EOF );istreamistream類的公有成員函數(shù)類的公有成員函數(shù) int gcount() const;輸出流和輸入流的常用成員函數(shù)輸出流和輸入流的常用成員函數(shù)函數(shù)函數(shù)功能功能putostream& put( char ch );無格式
14、無格式, ,插入一個插入一個字節(jié)字節(jié)writeostream& write( const char* pch, int nCount );從無格式從無格式, ,插入一字節(jié)序列插入一字節(jié)序列flush刷新輸出流刷新輸出流seekp移動輸出流指針移動輸出流指針tellp返回輸出流中指定位置的指針值返回輸出流中指定位置的指針值ostreamostream類的公有成員函數(shù)類的公有成員函數(shù) 用于字符輸入的流成員函數(shù)l不帶參數(shù)的get函數(shù) cin.get( ) n功能功能n從輸入流提取從輸入流提取1個字符個字符; n函數(shù)返回值就是該字符函數(shù)返回值就是該字符.n若遇到若遇到文件結束符文件結束符,則返
15、回值為則返回值為EOF,即即 -1.n如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入:I study C+. (程序結束程序結束)I study C+. Ctrl+ZEOFEnd Of File字符輸出的流成員函數(shù),字符輸出的流成員函數(shù),功功能能在顯示器上顯示一個在顯示器上顯示一個字符字符用于字符輸入的流成員函數(shù)2. 帶1 個參數(shù)的get函數(shù) cin.get(ch) n功能功能n從輸入流提取從輸入流提取1個字符放入個字符放入ch; n函數(shù)返回值就是非函數(shù)返回值就是非0值值n若遇到若遇到
16、文件結束符文件結束符,則返回值為則返回值為0n如: char ch; while ( cin.get(ch)!=0) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入:I study C+. (程序結束程序結束)I study C+. Ctrl+Z用于字符輸入的流成員函數(shù)3. 帶3 個參數(shù)的get函數(shù) cin.get(字符字符數(shù)組數(shù)組, 字符個數(shù)字符個數(shù)n, 終止字符終止字符)或或 cin.get(字符字符指針指針, 字符個數(shù)字符個數(shù)n, 終止字符終止字符)n功能功能n從輸入流提取從輸入流提取n-1個字符放入數(shù)組個字符放入數(shù)組; n函數(shù)返回值就是非函數(shù)返回值就是非0
17、值值n若遇到若遇到文件結束符文件結束符,則返回值為則返回值為0n如 char str20; cin.get(str, 10,“n”); coutstr; 鍵盤輸入鍵盤輸入: 顯示顯示: I study CI study C+. cin.get() 與 cin.getline() 的比較 cin.get(字符數(shù)組字符數(shù)組, 字符個數(shù)字符個數(shù)n, 終止字符終止字符) cin.getline(字符指針字符指針, 字符個數(shù)字符個數(shù)n, 終止字符終止字符)n相同之處:n從輸入流提取從輸入流提取n-1個字符放入數(shù)組個字符放入數(shù)組, n函數(shù)返回值是非函數(shù)返回值是非0值值.n若遇到文件結束符若遇到文件結束符,
18、則返回值為則返回值為0.n不同之處:n當讀到終止字符時,當讀到終止字符時,ncin.getline()將指針移到將指針移到終止字符之后終止字符之后。ncin.get() 將指針移到將指針移到終止字符處終止字符處。n則下次繼續(xù)讀取時的位置就不同。void main( ) char c1, c2, c3; char str180, str2100; cout輸入三個字符輸入三個字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout輸入第一行字符串輸入第一行字符串:; cin.get(str1,80); cin.get( ); c
19、out輸入第二行字符串輸入第二行字符串:; cin.getline(str2,80);cout.put(c1).put(c2). put(c3).put(n);cout.write(str1, 3); cout.write(str2, strlen(str2); cout.put(n); 輸入形式如下:WEAbcdefAbcdefg輸出結果?標識常量標識常量值值意義意義ios: goodbit0 x00狀態(tài)正常狀態(tài)正常ios: eofbit0 x01文件結束符,當文件結尾時設置該標志文件結束符,當文件結尾時設置該標志ios: failbit0 x02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復操作失敗
20、,數(shù)據(jù)未丟失,可以恢復ios: badbit0 x04非法操作,數(shù)據(jù)丟失,不可恢復非法操作,數(shù)據(jù)丟失,不可恢復0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 00 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0流錯誤狀態(tài)流錯誤狀態(tài)所有流都把流的狀態(tài)存儲在狀態(tài)字中所有流都把流的狀態(tài)存儲在狀態(tài)字中不同標志位中存儲不同的錯誤狀態(tài)位不同標志位中存儲不同的錯誤狀態(tài)位包含在類包含在類iosios的的enumenum成員中成員中 ios ios 處理流錯誤狀態(tài)的
21、公有成員函數(shù)處理流錯誤狀態(tài)的公有成員函數(shù) 函數(shù)函數(shù)功能功能int eof() const;返回返回eofbit狀態(tài)值。文件結束符時返回狀態(tài)值。文件結束符時返回1,否則返回,否則返回0 int fail() const;返回返回failbit狀態(tài)值狀態(tài)值int good() const; eofbit、failbit和和badbit都沒有被設置,則返回都沒有被設置,則返回1 int bad() const;badbit被設置,則返回被設置,則返回1 (當發(fā)生嚴重錯誤:如數(shù)據(jù)(當發(fā)生嚴重錯誤:如數(shù)據(jù)丟失)丟失)int rdstate() const;返回狀態(tài)字返回狀態(tài)字void clear( in
22、t nState = 0 );恢復或設置狀態(tài)字例如:恢復或設置狀態(tài)字例如:clear(ios:failbit)流錯誤狀態(tài)流錯誤狀態(tài)#includeusing namespace std; int integerValue; / display results of cin functions cout Before a bad input operation: ncin.rdstate(): cin.rdstate() n cin.eof(): cin.eof() n cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin
23、.good() integerValue; / enter character value cout endl; / display results of cin functions after bad input cout After a bad input operation: ncin.rdstate(): cin.rdstate() n cin.eof(): cin.eof() n cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin.good() endl endl; cin.clear(); / clear
24、stream / display results of cin functions after clearing cin cout After cin.clear() ncin.fail(): cin.fail() ncin.good(): cin.good() xcoutxoutfile a b ;10.5.3 文本文件a 0X00f3b 0X004e文件和流文件和流0 1 2 3 4 5 2 4 3 7 8 a 0X00f3b 0X004eint c ;c = a + b ;fout c= c a b ;寫文件寫文件c 0X0141c = 3 2 1 n 文件和流文件和流文件操作文件操作文
25、件操作的基本步驟:文件操作的基本步驟:定義一個文件流對象定義一個文件流對象打開文件打開文件讀讀 / / 寫文件寫文件關閉文件關閉文件 使用文件流類,使用文件流類,必須包含頭文件必須包含頭文件#include文件操作文件操作 - -定義一個文件流對象定義一個文件流對象 如:如: /用于與一個用于與一個輸入輸入文件建立聯(lián)系文件建立聯(lián)系 ifstream infile; ifstream infile; / /用于與一個用于與一個輸出輸出文件建立聯(lián)系文件建立聯(lián)系 ofstream outfile; ofstream outfile; /用于與一個用于與一個輸入輸出輸入輸出文件建立聯(lián)文件建立聯(lián) fst
26、ream iofile; fstream iofile; 文件操作文件操作- -打開文件打開文件 與外部文件關聯(lián);與外部文件關聯(lián); 指定文件的打開方式;指定文件的打開方式;有兩種方式打開文件有兩種方式打開文件方法方法1 1: 調用流類帶參數(shù)的構造函數(shù)調用流類帶參數(shù)的構造函數(shù) 建立流對象時連接外部文件建立流對象時連接外部文件 流類流類 對象名對象名 ( ( 文件名文件名 , , 方式方式 ) ;) ;文件操作文件操作- -打開文件打開文件 ifstream、ofstream 或或 fstream第二個參數(shù)表示文件的打開方式標識常量標識常量意義意義ios:in讀方式打開文件讀方式打開文件ios:o
27、ut寫方式打開文件寫方式打開文件ios:ate打開文件時,指針指向文件尾打開文件時,指針指向文件尾ios:app追加方式追加方式ios:trunc刪除文件現(xiàn)有內容刪除文件現(xiàn)有內容ios:binary二進制方式打開,默認為文本方式二進制方式打開,默認為文本方式ios:in|ios:out以輸入和輸出方式打開文件,文件可讀以輸入和輸出方式打開文件,文件可讀寫寫ios:out|ios:binary或者或者ios:in|ios:binary以二進制方式打開一個輸出(或者輸入)以二進制方式打開一個輸出(或者輸入)文件文件10.5.2 打開和關閉文件文件操作文件操作- -打開文件打開文件例如:例如:ifs
28、tream infile ( datafile.dat , ios:in ) ; ofstream outfile ( d:newfile.dat , ios:out );fstream rwfile ( myfile.dat , ios:in | ios:out ) ; ofstream ofile ( a:binary , ios : binary | ios : app ) ;用用 “| |”(或運算符)連接兩(或運算符)連接兩個表示打開方式的標識常量個表示打開方式的標識常量10.5.2 打開和關閉文件打開一個二進制文件進行追加操作打開一個二進制文件進行追加操作文件操作文件操作- -打開
29、文件打開文件 文件操作文件操作- -打開文件打開文件方法方法2 2 先建立流對象,后調用先建立流對象,后調用fstream:open()fstream:open()函函數(shù)連接外部文件數(shù)連接外部文件 流類流類 對象名對象名 ; ; 對象名對象名.open ( .open ( 文件名文件名 , , 方式方式 ) ;) ;打開文件成員函數(shù)打開文件成員函數(shù) 格式:格式:void fstream:open(const char *, int, int=filebuf:openprot);void ifstream:open(const char *, int=ios:in, int=filebuf:op
30、enprot);void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);打開的文件名打開的文件名文件的打開方式文件的打開方式文件打開時的保護方式文件打開時的保護方式,如:獨占打開如:獨占打開無缺省值無缺省值參數(shù)參數(shù) ios: 意義意義文件操作文件操作- -打開文件打開文件 打開一個已有文件打開一個已有文件datafile.datdatafile.dat,準備讀:,準備讀: ifstream infile ;ifstream infile ;/ / 建立輸入文件流對象建立輸入文件流對象 infile.open( in
31、file.open( “datafile.datdatafile.dat” , ios:in ) ; , ios:in ) ; / / 連接文件,指定打開方式連接文件,指定打開方式 打開(創(chuàng)建)一個文件打開(創(chuàng)建)一個文件newfile.datnewfile.dat,準備寫:,準備寫: ofstream outfile ;ofstream outfile ;/ / 建立輸出文件流對象建立輸出文件流對象 outfile.open( d:newfile.dat , ios:out ) ; outfile.open( d:newfile.dat , ios:out ) ; / / 連接文件,指定打開
32、方式連接文件,指定打開方式與與 cin 和和 cout 的用法相同的用法相同 如:如:infile x; outfile y;對文件進行讀寫操作對文件進行讀寫操作在對文件進行讀寫時,我們將文件看成在對文件進行讀寫時,我們將文件看成字符流字符流, 文件流文件流 讀寫位置指針讀寫位置指針隨著文件的讀寫,指針移動。隨著文件的讀寫,指針移動。 關閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,關閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,添加文件結束標志,切斷流對象和外部文件的連接添加文件結束標志,切斷流對象和外部文件的連接當一個流對象的生存期結束,系統(tǒng)也會自動關閉文當一個流對象的生存期結束,系統(tǒng)也會自動關閉
33、文件;件;若流對象的生存期沒有結束,用若流對象的生存期沒有結束,用close()close()關閉文件關閉文件 后,該流對象可以重用后,該流對象可以重用文件操作文件操作- -關閉文件關閉文件文件操作文件操作- -關閉文件關閉文件void ifstream:close( );void ofstream:close( );void fstream:close( );如:如:infile.close( ); /切斷與輸入文件切斷與輸入文件 myfile1.txt 的聯(lián)系的聯(lián)系 outfile.close( ); /切斷與輸出文件切斷與輸出文件 myfile2.txt 的聯(lián)系的聯(lián)系 iofile.cl
34、ose( ); /切斷與輸入輸出文件切斷與輸入輸出文件 myfile3.txt 的聯(lián)系的聯(lián)系文件讀寫完畢,必須關閉。文件讀寫完畢,必須關閉。 關閉文件成員函數(shù)關閉文件成員函數(shù) 格式格式 :eg: ofstream ofile ;ofstream ofile ;/ / 創(chuàng)建輸出文件流創(chuàng)建輸出文件流 ofile . open ( ofile . open ( “myfile1myfile1” , ios:outios:out ) ;) ; / ofile/ ofile流與文件流與文件“myfile1myfile1”相關聯(lián)相關聯(lián) / / 訪問訪問文件文件“myfile1myfile1” ofile
35、. close ( ) ; ofile . close ( ) ;/ / 關閉關閉文件文件“myfile1myfile1” ofile . open ( ofile . open ( “myfile2myfile2”, ios:out ); ios:out ); / / 重用對象重用對象ofileofile等價于使用構造函數(shù):等價于使用構造函數(shù):ofstream ofile ( “myfile1” , ios:out ) ;10.5.2 打開和關閉文件文件操作文件操作- -關閉文件關閉文件close ( ) close ( ) 函數(shù)關閉文件函數(shù)關閉文件但流對象仍然存在但流對象仍然存在打開與關閉
36、錯誤打開與關閉錯誤if( !outfile) / 之前outfile.open(“myfile2.dat”) cerr” error: unable to open file2!”; 檢測文件是否成功打開,可在條件表達式中使檢測文件是否成功打開,可在條件表達式中使用取反操作符(?。y試流狀態(tài)用取反操作符(?。y試流狀態(tài) (一般是讀文件的時候用)一般是讀文件的時候用)為了測試成功關閉文件,可以調用為了測試成功關閉文件,可以調用fail()fail()函數(shù),如函數(shù),如myfile2.close();if(myfile2.fail() cerrxy;myfile1.txt3 4內存內存infilex
37、y34用用infile代替代替myfile1.txt進行操作。進行操作。如何從文件中讀出數(shù)據(jù)?ofstream outfile; /定義輸出文件類對象定義輸出文件類對象outfile.open(“myfile2.txt”); /利用函數(shù)打開某一文利用函數(shù)打開某一文件件 float x3 , y4;outfilextyxy;outfilextyendl;infile.close();outfile.close();myfile1.txt3 4內存內存infilexy34myfile2.txtoutfile34infile.close( );outfile.close( );用完文件后,使用成員函
38、數(shù)關閉文件文件讀寫文件讀寫 - - 文本文件(順序文件)文本文件(順序文件)文本文件文本文件 文件的每個字節(jié)都是用文件的每個字節(jié)都是用ASCIIASCII代碼存放數(shù)據(jù),代碼存放數(shù)據(jù), 即每個字節(jié)存放一個字符,這種文件又稱字符文件即每個字節(jié)存放一個字符,這種文件又稱字符文件 文件的默認打開方式為文本文件文件的默認打開方式為文本文件 文本文件是順序存取文件文本文件是順序存取文件 文本文件本身沒有記錄邏輯結構,文本文件本身沒有記錄邏輯結構, 通常一個邏輯記通常一個邏輯記錄用換行符分隔;數(shù)據(jù)項之間可以用空白符、換行錄用換行符分隔;數(shù)據(jù)項之間可以用空白符、換行 符、制表符等分隔。符、制表符等分隔。#in
39、clude #include using namespace std;void main( )int a10; ofstream outfile(“f1.dat”); /定義文件流對象,打開文件定義文件流對象,打開文件f1.dat if (!outfile) /若打開失敗,返回若打開失敗,返回 0值值 cerropen error!endl; exit(1); coutenter 10 integer numbers:endl; for(int i=0;iai; outfileai ; /向文件向文件f1.dat輸出數(shù)據(jù)輸出數(shù)據(jù) outfile.close(); /關閉文件關閉文件f1.dat
40、 例23.11 有一個整型數(shù)組,含10個元素,從鍵盤輸入10個整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件地f1.dat中存放。文件處理流程文件處理流程定義并打開文件對象定義并打開文件對象打開文件出錯處理打開文件出錯處理對文件進對文件進行行R/W操作操作關閉文件對象關閉文件對象#include #include using namespace std;void main ( ) ofstream ost ; ost.open (C:my2.txt ) ; ost 1234567890 endl ; int a = 123 ; ost a endl ; ost setw ( 10 ) a endl ; os
41、t setiosflags ( ios : left ) setfill ( # ) setw ( 10 ) a endl ; ost setiosflags ( ios : right ) setprecision ( 5 ) setw ( 10 ) 12.34567890 endl ; ost . close ( ) ; 例例:使用格式控制建立的文本文件使用格式控制建立的文本文件以指定格式以指定格式插入數(shù)據(jù)插入數(shù)據(jù)默認方式默認方式打開文本文件打開文本文件#include #include using namespace std;void main() ofstream out(test.t
42、xt ) ; if ( !out ) cout cannot open file. ; return ; out 10 123.45 ; out nThis is a short text file. ; out.close () ; 例:例: 將數(shù)據(jù)寫入到將數(shù)據(jù)寫入到文件文件對數(shù)值常量對數(shù)值常量做轉換做轉換#include #include using namespace std;void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! in ) co
43、ut i f ch str1 str2 ; cout i “ ” f “ ” ch n ; cout str1 str2 endl ; in.close () ;ifstream inint i float f char chchar str1char str210.5.3 文本文件例例 從從文件文件 讀出數(shù)據(jù)讀出數(shù)據(jù)#include #include using namespace std; void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! i
44、n ) cout i f ch str1 str2 ; cout i “ ” f “ ” ch n ; cout str1 str2 endl ; in.close () ;10.5.3 文本文件例例 :從:從文件文件 讀出數(shù)據(jù)讀出數(shù)據(jù)int i 10float f 123.45char ch Tchar str1 hischar str2 isostream cout#includeusing namespace std;void main() char str = tNew string ; ofstream f2 (test.txt , ios:app ) ; / 追加方式追加方式 if
45、 ( !f2 ) cout cannot open testnew for ouput. ; return ; f2 str ;/ 插入字符串插入字符串 f2.close () ;例在例在文件文件 testnew testnew 的末尾添加字符串的末尾添加字符串插入串插入串#include#include using namespace std;void main ( ) char ch ; ifstream f1 ( test.txt ) ; if ( !f1 ) cout cannot open test for input. ; return ; ofstream f2 ( testne
46、w.txt ) ; if ( !f2 ) cout cannot open testnew for ouput. ; return ; while ( f1 & f1.get(ch) ) f2.put( ch ) ; f1.close () ; f2.close () ; cout It is over !n ;ifstream f1ofstream f2ch10.5.3 文本文件例例: :復制數(shù)據(jù)到文件復制數(shù)據(jù)到文件 將文件將文件testtest的內容復制到的內容復制到testnew testnew 中中例例 將數(shù)值將數(shù)值1100及其平方根寫入文件及其平方根寫入文件 sqrttabl
47、e.txt #include #include #includeusing namespace std;void main( ) double x; ofstream out; / 定義一個輸出流對象定義一個輸出流對象 out.open(sqrttable.txt); / 打開文本文件打開文本文件sqrttable.txt for(x=1; x=100; x+)outxtsqrt(x)endl; / 將結果寫入文件將結果寫入文件 out.close( ); / 關閉文件關閉文件例例 編寫一個程序,用于顯示一個文本文件編寫一個程序,用于顯示一個文本文件 #include #include usi
48、ng namespace std;void main( )char filename40, line80;ifstream infile; coutfilename; / A infile.open(filename); / B 如果打開不成功,如果打開不成功, infile 為為 0if(!infile) coutCan not open file: filenameendl;exit(1);while(infile.getline(line, 80) / 讀入一行讀入一行coutlinech) / 讀入一個字符讀入一個字符 coutch; / 顯示一個字符顯示一個字符例例 從一個文本文件從
49、一個文本文件source.txt中讀入若干整數(shù),中讀入若干整數(shù), 用選擇法將這些數(shù)據(jù)排成升序,用選擇法將這些數(shù)據(jù)排成升序, 將排序后的結果寫入將排序后的結果寫入 另一個文件文本文件另一個文件文本文件target.txt中中事前準備數(shù)據(jù)文件:事前準備數(shù)據(jù)文件: source.txt #include #include using namespace std;void sort(int *a, int n) /一般的選擇法排序函數(shù)int i, j, p, t;for(i=0; in-1; i+)p=i;for(j=i+1; jn; j+)if(ajap) p=j;if(p!=i) t=ai;ai=
50、ap; ap=t; void main( )int a100, i, n;fstream in, out; in.open(c:source.txt, ios:in); if(!in) coutCan not open source.txt!endl;exit(1); out.open(c:target.txt, ios:out); if(!out) coutCan not open target.txt!ai) i+; /循環(huán)結束后,i是整數(shù)的個數(shù)sort(a, i ); n=i; for(i=0; in; i+) outaiendl; in.close( ); out.close( );
51、文件讀寫文件讀寫 -二進制文件(隨機存取文件)二進制文件(隨機存取文件) 二進制文件以基本類型數(shù)據(jù)在內存的二進制表示形式二進制文件以基本類型數(shù)據(jù)在內存的二進制表示形式 存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉換存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉換 ;打開二進制文件用打開二進制文件用ios:binaryios:binary方式方式 ;二進制文件的讀寫方式由程序控制二進制文件的讀寫方式由程序控制 ;二進制文件是隨機存取文件二進制文件是隨機存取文件 。23.4.5 對二進制文件的操作若在文件的打開方式中沒有特別說明,打開的文件均為若在文件的打開方式中沒有特別說明,打開的文件均為ASCII碼碼文件,
52、文件,若要打開二進制文件,則要特別說明并用特定的讀寫函數(shù)若要打開二進制文件,則要特別說明并用特定的讀寫函數(shù)。fstream infile,outfile;infile.open(“inf1.dat”, ios:in| ios:binary);outfile.open(“outf1.dat”, ios:out| ios:binary); 文件名文件名 輸入方式打開輸入方式打開 二進制文件二進制文件 文件名文件名 輸出方式打開輸出方式打開 二進制文件二進制文件1. 文件的讀寫操作(成塊讀寫)文件的讀寫操作(成塊讀寫)成員函數(shù):成員函數(shù):istream & istream:read( cha
53、r *, int );istream & istream:read( unsigned char *, int );istream & istream:read( signed char *, int );ostream & ostream:write( const char *, int );ostream & ostream:write( const unsigned char *, int );ostream & ostream:write( const signed char *, int );前三個為讀取操作前三個為讀取操作:將第二個參數(shù)指定的
54、字節(jié)數(shù)讀入到:將第二個參數(shù)指定的字節(jié)數(shù)讀入到 以第一個參數(shù)為起始地址的內存中。以第一個參數(shù)為起始地址的內存中。 后三個為寫操作后三個為寫操作:從第一個參數(shù)為起始地址的內存開始,:從第一個參數(shù)為起始地址的內存開始, 將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的將連續(xù)的第二個參數(shù)指定字節(jié)數(shù)的 內容寫到文件中。內容寫到文件中。 0 1 2 3 4 5 n-1文件指針文件指針10.5.1 文件和流ios:begios:curios:end二進制文件的順序讀寫二進制文件的順序讀寫流的狀態(tài)表示:流的內容、長度和操作位置流的狀態(tài)表示:流的內容、長度和操作位置 ostream 類中兩個操作字節(jié)數(shù)據(jù)的成員函數(shù)類中兩個操作字節(jié)
55、數(shù)據(jù)的成員函數(shù) ofstream outf( test.dat , ios:out | ios:binary ) ; int a10 =1,2,3,4,5; for(int i = 0; i 10 ; i + ) outf.write( (char *) (&ai), sizeof(int) ) ; outf.close(); 二進制文件的順序讀寫二進制文件的順序讀寫outf.write(reinterpret_cast (a) , 10*sizeof(int); istream 類中操作字節(jié)數(shù)據(jù)的成員函數(shù)類中操作字節(jié)數(shù)據(jù)的成員函數(shù) get ( char & c ) ; c =
56、 get ( ) ; getline ( char * buffer , int size, char = n) ;10.5.4 二進制文件istream & istream : read ( char * buf , int n ) ;從流中提取從流中提取 n 個字節(jié)數(shù)據(jù),更新對象個字節(jié)數(shù)據(jù),更新對象 buf ifstream inf( test.dat , ios:in| ios:binary ) ;int buffer10; for( int j = 0; j10 ; j + ) inf.read(char*) &bufferj, sizeof(int) );inf.re
57、ad( reinterpret_cast(buffer), 10*sizeof(int) ) ; 注意類型轉換注意類型轉換二進制文件的順序讀寫二進制文件的順序讀寫例23.14 將一批數(shù)據(jù)以二進制形式存放在磁盤文件中。#include #include using namespace std;struct student char name20; int num; int age; char sex;void main( )student stud3=“Li”,1001,18, f, “Fun”,1002,19,m, “Wang”,1004,17,f; ofstream outfile(“stu
58、d.dat”, ios:out | ios:binary); if(!outfile) cerropen error!endl; abort( ); /退出程序 for(int i=0; i3; i+) outfile.write(char*)&studi, sizeof(studi);outfile.close( );可以一次輸出整個數(shù)組到磁盤文件:outfile.write(char*)&stud0, sizeof(stud);n用此方法一次可以輸出一批數(shù)據(jù),效率較高。用此方法一次可以輸出一批數(shù)據(jù),效率較高。n在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加在輸出的數(shù)據(jù)
59、之間不必加入空格,在一次輸出之后也不必加回車換行符?;剀嚀Q行符。n在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。是用字節(jié)數(shù)來控制。例23.14 將一批數(shù)據(jù)以二進制形式存放在磁盤文件中例23.15 將剛才以二進制形式存放在磁盤文件中的數(shù)據(jù)讀入內存并在顯示器上顯示。#include #include using namespace std;struct studentstring name; int num; int age; char sex;void main( )student stud3; int i; ifstr
60、eam infile(“stud.dat”, ios:in | ios:binary); if(!infile) cerr“open error!”endl; abort( ); for(i=0;i3;i+) infile.read(char*)&studi , sizeof(studi); infile.close( ); for(i=0;i3;i+) cout“NO.”i+1endl; cout“name:”endl; cout“num:” studi.numendl; cout“age:” studi.ageendl; cout“sex:”studi.sexendlendl; 問題:問題:能否一次讀入文件中的全部數(shù)據(jù),如能否一次讀入文件中的全部數(shù)據(jù),如 infile.read( (char*)&stud0 , sizeof(st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32T-防汛抗旱特征水位核定規(guī)程編制說明
- 海南省??谑?024-2025學年四年級(上)期末語文試卷(含答案)
- 2025年社會服務行業(yè)投資策略報告:穩(wěn)舵定錨行致遠奮楫揚帆譜新篇
- 球的表面積和體積課件
- 【大學課件】單片機的系統(tǒng)擴展
- 經(jīng)濟學馬曉蓮課件房地產(chǎn)市場研究分析
- 中國證券市場供需格局及未來發(fā)展趨勢報告
- 2025年容積泵項目可行性研究報告
- 中國陶瓷耐磨磚項目投資可行性研究報告
- 2025共同出資合作開發(fā)地塊合同模板
- 粉末涂料有限公司危廢庫安全風險分級管控清單
- 750更換齒輪箱作業(yè)指導書
- GB/T 20706-2023可可粉質量要求
- 安全生產(chǎn)信息管理制度全
- 猜歌名教學講解課件
- 世界主要國家洲別、名稱、首都、代碼、區(qū)號、時差匯總表
- 2023學年廣東省廣州市越秀區(qū)鐵一中學九年級(上)物理期末試題及答案解析
- 《報告文學研究》(07562)自考考試復習題庫(含答案)
- 應急避難場所項目建議書
- 電源日常點檢記錄表
- 人教版小學三年級語文上冊期末測試卷.及答題卡2
評論
0/150
提交評論