版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第2323章章 輸入與輸出流輸入與輸出流提綱提綱l輸出流和輸入流的常用成員函數(shù)l流操縱符l流的錯(cuò)誤狀態(tài)l文件和流l文件操作打開文件打開文件讀讀 / / 寫文件寫文件關(guān)閉文件關(guān)閉文件23.1 C+的輸入和輸出(I/O)n 輸入和輸出,要看以什么為對象 n 以標(biāo)準(zhǔn)I/O設(shè)備為對象n從鍵盤、鼠標(biāo)得到的數(shù)據(jù)是進(jìn)入從鍵盤、鼠標(biāo)得到的數(shù)據(jù)是進(jìn)入內(nèi)存內(nèi)存的,該數(shù)據(jù)是輸入數(shù)據(jù)。的,該數(shù)據(jù)是輸入數(shù)據(jù)。n將數(shù)據(jù)從將數(shù)據(jù)從內(nèi)存內(nèi)存送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)。送到顯示器、打印機(jī)等,該數(shù)據(jù)是輸出數(shù)據(jù)。n 以外存磁盤文件為對象n內(nèi)存中的數(shù)據(jù)內(nèi)存中的數(shù)據(jù)存儲(chǔ)到磁盤文件中,叫輸出文件;存儲(chǔ)到磁盤文件中,叫輸出文
2、件;n從磁盤文件中的數(shù)據(jù)裝載入從磁盤文件中的數(shù)據(jù)裝載入內(nèi)存中內(nèi)存中,叫輸入文件。,叫輸入文件。n 以內(nèi)存中指定的空間作為對象n常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間,這種常指定一個(gè)字符數(shù)組作為存儲(chǔ)空間,這種I/O稱為字符串的輸入稱為字符串的輸入輸出。輸出。n C+采取不同的方法實(shí)現(xiàn)以上三種采取不同的方法實(shí)現(xiàn)以上三種I/O。標(biāo)準(zhǔn)標(biāo)準(zhǔn)I/O文件文件I/O串串I/On數(shù)據(jù)之間的傳輸過程稱作流(stream)n 輸入流輸入流表示數(shù)據(jù)從某個(gè)載體或設(shè)備傳送到表示數(shù)據(jù)從某個(gè)載體或設(shè)備傳送到內(nèi)存內(nèi)存n 輸出流輸出流表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€(gè)載體或表示數(shù)據(jù)從內(nèi)存?zhèn)魉偷侥硞€(gè)載體或設(shè)備設(shè)備C+的輸入輸出流內(nèi)內(nèi)存存鍵盤鍵盤文件
3、文件光筆光筆.輸入流輸入流顯示器顯示器文件文件打印機(jī)打印機(jī).輸出流輸出流n在進(jìn)行I/O操作時(shí)n 首先進(jìn)行首先進(jìn)行“打開打開”操作,使流和文件發(fā)生聯(lián)系操作,使流和文件發(fā)生聯(lián)系n 建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出n I/O結(jié)束后,使用結(jié)束后,使用“關(guān)閉關(guān)閉”操作使文件與流斷開聯(lián)系。操作使文件與流斷開聯(lián)系。nC+將I/O流定義為類流類。屬于流類的對象是流對象n 系統(tǒng)已經(jīng)以系統(tǒng)已經(jīng)以運(yùn)算符或函數(shù)運(yùn)算符或函數(shù)的形式做好了對標(biāo)準(zhǔn)外設(shè)的形式做好了對標(biāo)準(zhǔn)外設(shè)(鍵盤、顯示器、打印機(jī)、鍵盤、顯示器、打印機(jī)、文件文件)的接口,使用時(shí)只需的接口,使用時(shí)只需按照要求的格式調(diào)用即可
4、。按照要求的格式調(diào)用即可。n 如:如:cin 標(biāo)準(zhǔn)輸入流對象。標(biāo)準(zhǔn)輸入流對象。 cout 標(biāo)準(zhǔn)輸出流對象。標(biāo)準(zhǔn)輸出流對象。C+的輸入輸出流I/OI/O流模板層次部分流模板層次部分C+的各種I/O流類庫nC+為實(shí)現(xiàn)數(shù)據(jù)的I/O定義了一個(gè)龐大的類庫。它包括的類主要有輸出char *變量的地址值lchar * p=“asd”;lcoutpendl;lcoutstatic_cast(p);輸入和輸出流對象輸入和輸出流對象l預(yù)先定義的輸出和輸入流對象:cout 標(biāo)準(zhǔn)輸出cerr 標(biāo)準(zhǔn)錯(cuò)誤輸出,沒有緩沖,發(fā)送給它的內(nèi)容立即被輸出。clog 類似于cerr,但是有緩沖,緩沖區(qū)滿時(shí)被輸出。cin標(biāo)準(zhǔn)輸入23.
5、2 標(biāo)準(zhǔn)輸出流 n標(biāo)準(zhǔn)輸出流流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù) ncout流對象在控制臺(tái)(顯示器)輸出n 用用流插入運(yùn)算符流插入運(yù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流對象在控制臺(tái)(顯示器)輸出錯(cuò)誤信息n 用用流插入運(yùn)算符流插入運(yùn)算符“”向向cerr輸出數(shù)據(jù)輸出數(shù)據(jù).n 如: cerr “除數(shù)為除數(shù)為0, 出錯(cuò)出錯(cuò)!” endl; cerr的用法與的用法與cout類似類似.ncout流對象與cerr流對象的不同之處n cout的輸出默認(rèn)是顯示器的輸出默認(rèn)是顯示器,但可以被重定向?yàn)檩敵龅酱疟P但可
6、以被重定向?yàn)檩敵龅酱疟P文件文件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, 不是二次方程,出錯(cuò)!不是二次方程,出錯(cuò)!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程無實(shí)根。二次方程無實(shí)根?!眅ndl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2*a)endl; 標(biāo)準(zhǔn)
7、輸出流n 標(biāo)準(zhǔn)輸出流流向標(biāo)準(zhǔn)輸出設(shè)備(顯示器)的數(shù)據(jù)n clog流對象在控制臺(tái)(顯示器)輸出錯(cuò)誤信息.n 用用流插入運(yùn)算符流插入運(yùn)算符“”向向clog輸出數(shù)據(jù)輸出數(shù)據(jù).n 如如: clog “除數(shù)為除數(shù)為0, 出錯(cuò)出錯(cuò)!” endl;n clog的用法與的用法與cerr類似類似.n clog流對象與cerr流對象的不同之處n cerr是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。是不經(jīng)過緩沖區(qū),直接向顯示器輸出有關(guān)信息。n clog的輸出先存儲(chǔ)在緩沖區(qū),遇到緩沖區(qū)滿或遇到的輸出先存儲(chǔ)在緩沖區(qū),遇到緩沖區(qū)滿或遇到endl時(shí)才向顯時(shí)才向顯示器輸出。示器輸出。用流對象的成員控制格式輸出說明: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個(gè)整數(shù)n當(dāng)輸入時(shí)n 遇到無效的字符遇到無效的字符n 或遇到文件結(jié)束符或遇到文件結(jié)束符 ctrl+z 時(shí)時(shí) cin處于出錯(cuò)狀態(tài),無法正常提取數(shù)據(jù)(cin=false). if (!cin) cout“輸入出錯(cuò)輸入出錯(cuò)”;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返回流中下一個(gè)字符,但不從流中刪除返回流中下一個(gè)字符,但不從流中刪除gcount統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)eatwhite忽略前導(dǎo)空格忽略前導(dǎo)空格seekg移動(dòng)輸入流指針移動(dòng)輸入流指針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 );讀取一個(gè)字符讀取一個(gè)字符,不跳過空白字符不跳過空白字符讀取一行字符,讀取一行字符,不提取不提取n函數(shù)函數(shù)功能功能read無格式輸入指定字節(jié)數(shù)無格式輸入指定字節(jié)數(shù)get從流中提取字符,包括空格getline從流中提取一
13、行字符ignore提取并丟棄流中指定字符提取并丟棄流中指定字符peek返回流中下一個(gè)字符,但不從流中刪除gcount統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)統(tǒng)計(jì)最后輸入的字符個(gè)數(shù)eatwhite忽略前導(dǎo)空格seekg移動(dòng)輸入流指針tellg返回輸入流中指定位置的指針值istream& ignore( int nCount = 1, int delim = EOF );istreamistream類的公有成員函數(shù)類的公有成員函數(shù) int gcount() const;輸出流和輸入流的常用成員函數(shù)輸出流和輸入流的常用成員函數(shù)函數(shù)函數(shù)功能功能putostream& put( char ch );無格式
14、無格式, ,插入一個(gè)插入一個(gè)字節(jié)字節(jié)writeostream& write( const char* pch, int nCount );從無格式從無格式, ,插入一字節(jié)序列插入一字節(jié)序列flush刷新輸出流刷新輸出流seekp移動(dòng)輸出流指針移動(dòng)輸出流指針tellp返回輸出流中指定位置的指針值返回輸出流中指定位置的指針值ostreamostream類的公有成員函數(shù)類的公有成員函數(shù) 用于字符輸入的流成員函數(shù)l不帶參數(shù)的get函數(shù) cin.get( ) n功能功能n從輸入流提取從輸入流提取1個(gè)字符個(gè)字符; n函數(shù)返回值就是該字符函數(shù)返回值就是該字符.n若遇到若遇到文件結(jié)束符文件結(jié)束符,則返
15、回值為則返回值為EOF,即即 -1.n如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入:I study C+. (程序結(jié)束程序結(jié)束)I study C+. Ctrl+ZEOFEnd Of File字符輸出的流成員函數(shù),字符輸出的流成員函數(shù),功功能能在顯示器上顯示一個(gè)在顯示器上顯示一個(gè)字符字符用于字符輸入的流成員函數(shù)2. 帶1 個(gè)參數(shù)的get函數(shù) cin.get(ch) n功能功能n從輸入流提取從輸入流提取1個(gè)字符放入個(gè)字符放入ch; n函數(shù)返回值就是非函數(shù)返回值就是非0值值n若遇到若遇到
16、文件結(jié)束符文件結(jié)束符,則返回值為則返回值為0n如: char ch; while ( cin.get(ch)!=0) cout.put(ch); 鍵盤輸入鍵盤輸入: 顯示顯示: 鍵盤輸入鍵盤輸入:I study C+. (程序結(jié)束程序結(jié)束)I study C+. Ctrl+Z用于字符輸入的流成員函數(shù)3. 帶3 個(gè)參數(shù)的get函數(shù) cin.get(字符字符數(shù)組數(shù)組, 字符個(gè)數(shù)字符個(gè)數(shù)n, 終止字符終止字符)或或 cin.get(字符字符指針指針, 字符個(gè)數(shù)字符個(gè)數(shù)n, 終止字符終止字符)n功能功能n從輸入流提取從輸入流提取n-1個(gè)字符放入數(shù)組個(gè)字符放入數(shù)組; n函數(shù)返回值就是非函數(shù)返回值就是非0
17、值值n若遇到若遇到文件結(jié)束符文件結(jié)束符,則返回值為則返回值為0n如 char str20; cin.get(str, 10,“n”); coutstr; 鍵盤輸入鍵盤輸入: 顯示顯示: I study CI study C+. cin.get() 與 cin.getline() 的比較 cin.get(字符數(shù)組字符數(shù)組, 字符個(gè)數(shù)字符個(gè)數(shù)n, 終止字符終止字符) cin.getline(字符指針字符指針, 字符個(gè)數(shù)字符個(gè)數(shù)n, 終止字符終止字符)n相同之處:n從輸入流提取從輸入流提取n-1個(gè)字符放入數(shù)組個(gè)字符放入數(shù)組, n函數(shù)返回值是非函數(shù)返回值是非0值值.n若遇到文件結(jié)束符若遇到文件結(jié)束符,
18、則返回值為則返回值為0.n不同之處:n當(dāng)讀到終止字符時(shí),當(dāng)讀到終止字符時(shí),ncin.getline()將指針移到將指針移到終止字符之后終止字符之后。ncin.get() 將指針移到將指針移到終止字符處終止字符處。n則下次繼續(xù)讀取時(shí)的位置就不同。void main( ) char c1, c2, c3; char str180, str2100; cout輸入三個(gè)字符輸入三個(gè)字符:; 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輸出結(jié)果?標(biāo)識(shí)常量標(biāo)識(shí)常量值值意義意義ios: goodbit0 x00狀態(tài)正常狀態(tài)正常ios: eofbit0 x01文件結(jié)束符,當(dāng)文件結(jié)尾時(shí)設(shè)置該標(biāo)志文件結(jié)束符,當(dāng)文件結(jié)尾時(shí)設(shè)置該標(biāo)志ios: failbit0 x02I/O操作失敗,數(shù)據(jù)未丟失,可以恢復(fù)操作失敗
20、,數(shù)據(jù)未丟失,可以恢復(fù)ios: badbit0 x04非法操作,數(shù)據(jù)丟失,不可恢復(fù)非法操作,數(shù)據(jù)丟失,不可恢復(fù)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流錯(cuò)誤狀態(tài)流錯(cuò)誤狀態(tài)所有流都把流的狀態(tài)存儲(chǔ)在狀態(tài)字中所有流都把流的狀態(tài)存儲(chǔ)在狀態(tài)字中不同標(biāo)志位中存儲(chǔ)不同的錯(cuò)誤狀態(tài)位不同標(biāo)志位中存儲(chǔ)不同的錯(cuò)誤狀態(tài)位包含在類包含在類iosios的的enumenum成員中成員中 ios ios 處理流錯(cuò)誤狀態(tài)的
21、公有成員函數(shù)處理流錯(cuò)誤狀態(tài)的公有成員函數(shù) 函數(shù)函數(shù)功能功能int eof() const;返回返回eofbit狀態(tài)值。文件結(jié)束符時(shí)返回狀態(tài)值。文件結(jié)束符時(shí)返回1,否則返回,否則返回0 int fail() const;返回返回failbit狀態(tài)值狀態(tài)值int good() const; eofbit、failbit和和badbit都沒有被設(shè)置,則返回都沒有被設(shè)置,則返回1 int bad() const;badbit被設(shè)置,則返回被設(shè)置,則返回1 (當(dāng)發(fā)生嚴(yán)重錯(cuò)誤:如數(shù)據(jù)(當(dāng)發(fā)生嚴(yán)重錯(cuò)誤:如數(shù)據(jù)丟失)丟失)int rdstate() const;返回狀態(tài)字返回狀態(tài)字void clear( in
22、t nState = 0 );恢復(fù)或設(shè)置狀態(tài)字例如:恢復(fù)或設(shè)置狀態(tài)字例如:clear(ios:failbit)流錯(cuò)誤狀態(tài)流錯(cuò)誤狀態(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、件操作的基本步驟:文件操作的基本步驟:定義一個(gè)文件流對象定義一個(gè)文件流對象打開文件打開文件讀讀 / / 寫文件寫文件關(guān)閉文件關(guān)閉文件 使用文件流類,使用文件流類,必須包含頭文件必須包含頭文件#include文件操作文件操作 - -定義一個(gè)文件流對象定義一個(gè)文件流對象 如:如: /用于與一個(gè)用于與一個(gè)輸入輸入文件建立聯(lián)系文件建立聯(lián)系 ifstream infile; ifstream infile; / /用于與一個(gè)用于與一個(gè)輸出輸出文件建立聯(lián)系文件建立聯(lián)系 ofstream outfile; ofstream outfile; /用于與一個(gè)用于與一個(gè)輸入輸出輸入輸出文件建立聯(lián)文件建立聯(lián) fst
26、ream iofile; fstream iofile; 文件操作文件操作- -打開文件打開文件 與外部文件關(guān)聯(lián);與外部文件關(guān)聯(lián); 指定文件的打開方式;指定文件的打開方式;有兩種方式打開文件有兩種方式打開文件方法方法1 1: 調(diào)用流類帶參數(shù)的構(gòu)造函數(shù)調(diào)用流類帶參數(shù)的構(gòu)造函數(shù) 建立流對象時(shí)連接外部文件建立流對象時(shí)連接外部文件 流類流類 對象名對象名 ( ( 文件名文件名 , , 方式方式 ) ;) ;文件操作文件操作- -打開文件打開文件 ifstream、ofstream 或或 fstream第二個(gè)參數(shù)表示文件的打開方式標(biāo)識(shí)常量標(biāo)識(shí)常量意義意義ios:in讀方式打開文件讀方式打開文件ios:o
27、ut寫方式打開文件寫方式打開文件ios:ate打開文件時(shí),指針指向文件尾打開文件時(shí),指針指向文件尾ios:app追加方式追加方式ios:trunc刪除文件現(xiàn)有內(nèi)容刪除文件現(xiàn)有內(nèi)容ios:binary二進(jìn)制方式打開,默認(rèn)為文本方式二進(jìn)制方式打開,默認(rèn)為文本方式ios:in|ios:out以輸入和輸出方式打開文件,文件可讀以輸入和輸出方式打開文件,文件可讀寫寫ios:out|ios:binary或者或者ios:in|ios:binary以二進(jìn)制方式打開一個(gè)輸出(或者輸入)以二進(jìn)制方式打開一個(gè)輸出(或者輸入)文件文件10.5.2 打開和關(guān)閉文件文件操作文件操作- -打開文件打開文件例如:例如: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 ) ;用用 “| |”(或運(yùn)算符)連接兩(或運(yùn)算符)連接兩個(gè)表示打開方式的標(biāo)識(shí)常量個(gè)表示打開方式的標(biāo)識(shí)常量10.5.2 打開和關(guān)閉文件打開一個(gè)二進(jìn)制文件進(jìn)行追加操作打開一個(gè)二進(jìn)制文件進(jìn)行追加操作文件操作文件操作- -打開
29、文件打開文件 文件操作文件操作- -打開文件打開文件方法方法2 2 先建立流對象,后調(diào)用先建立流對象,后調(diào)用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í)的保護(hù)方式文件打開時(shí)的保護(hù)方式,如:獨(dú)占打開如:獨(dú)占打開無缺省值無缺省值參數(shù)參數(shù) ios: 意義意義文件操作文件操作- -打開文件打開文件 打開一個(gè)已有文件打開一個(gè)已有文件datafile.datdatafile.dat,準(zhǔn)備讀:,準(zhǔn)備讀: ifstream infile ;ifstream infile ;/ / 建立輸入文件流對象建立輸入文件流對象 infile.open( in
31、file.open( “datafile.datdatafile.dat” , ios:in ) ; , ios:in ) ; / / 連接文件,指定打開方式連接文件,指定打開方式 打開(創(chuàng)建)一個(gè)文件打開(創(chuàng)建)一個(gè)文件newfile.datnewfile.dat,準(zhǔn)備寫:,準(zhǔn)備寫: 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;對文件進(jìn)行讀寫操作對文件進(jìn)行讀寫操作在對文件進(jìn)行讀寫時(shí),我們將文件看成在對文件進(jìn)行讀寫時(shí),我們將文件看成字符流字符流, 文件流文件流 讀寫位置指針讀寫位置指針隨著文件的讀寫,指針移動(dòng)。隨著文件的讀寫,指針移動(dòng)。 關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,關(guān)閉文件操作包括把緩沖區(qū)數(shù)據(jù)完整地寫入文件,添加文件結(jié)束標(biāo)志,切斷流對象和外部文件的連接添加文件結(jié)束標(biāo)志,切斷流對象和外部文件的連接當(dāng)一個(gè)流對象的生存期結(jié)束,系統(tǒng)也會(huì)自動(dòng)關(guān)閉文當(dāng)一個(gè)流對象的生存期結(jié)束,系統(tǒng)也會(huì)自動(dòng)關(guān)閉
33、文件;件;若流對象的生存期沒有結(jié)束,用若流對象的生存期沒有結(jié)束,用close()close()關(guān)閉文件關(guān)閉文件 后,該流對象可以重用后,該流對象可以重用文件操作文件操作- -關(guān)閉文件關(guān)閉文件文件操作文件操作- -關(guān)閉文件關(guān)閉文件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)系文件讀寫完畢,必須關(guān)閉。文件讀寫完畢,必須關(guān)閉。 關(guān)閉文件成員函數(shù)關(guān)閉文件成員函數(shù) 格式格式 :eg: ofstream ofile ;ofstream ofile ;/ / 創(chuàng)建輸出文件流創(chuàng)建輸出文件流 ofile . open ( ofile . open ( “myfile1myfile1” , ios:outios:out ) ;) ; / ofile/ ofile流與文件流與文件“myfile1myfile1”相關(guān)聯(lián)相關(guān)聯(lián) / / 訪問訪問文件文件“myfile1myfile1” ofile
35、. close ( ) ; ofile . close ( ) ;/ / 關(guān)閉關(guān)閉文件文件“myfile1myfile1” ofile . open ( ofile . open ( “myfile2myfile2”, ios:out ); ios:out ); / / 重用對象重用對象ofileofile等價(jià)于使用構(gòu)造函數(shù):等價(jià)于使用構(gòu)造函數(shù):ofstream ofile ( “myfile1” , ios:out ) ;10.5.2 打開和關(guān)閉文件文件操作文件操作- -關(guān)閉文件關(guān)閉文件close ( ) close ( ) 函數(shù)關(guān)閉文件函數(shù)關(guān)閉文件但流對象仍然存在但流對象仍然存在打開與關(guān)閉
36、錯(cuò)誤打開與關(guān)閉錯(cuò)誤if( !outfile) / 之前outfile.open(“myfile2.dat”) cerr” error: unable to open file2!”; 檢測文件是否成功打開,可在條件表達(dá)式中使檢測文件是否成功打開,可在條件表達(dá)式中使用取反操作符(!)測試流狀態(tài)用取反操作符(?。y試流狀態(tài) (一般是讀文件的時(shí)候用)一般是讀文件的時(shí)候用)為了測試成功關(guān)閉文件,可以調(diào)用為了測試成功關(guān)閉文件,可以調(diào)用fail()fail()函數(shù),如函數(shù),如myfile2.close();if(myfile2.fail() cerrxy;myfile1.txt3 4內(nèi)存內(nèi)存infilex
37、y34用用infile代替代替myfile1.txt進(jìn)行操作。進(jìn)行操作。如何從文件中讀出數(shù)據(jù)?ofstream outfile; /定義輸出文件類對象定義輸出文件類對象outfile.open(“myfile2.txt”); /利用函數(shù)打開某一文利用函數(shù)打開某一文件件 float x3 , y4;outfilextyxy;outfilextyendl;infile.close();outfile.close();myfile1.txt3 4內(nèi)存內(nèi)存infilexy34myfile2.txtoutfile34infile.close( );outfile.close( );用完文件后,使用成員函
38、數(shù)關(guān)閉文件文件讀寫文件讀寫 - - 文本文件(順序文件)文本文件(順序文件)文本文件文本文件 文件的每個(gè)字節(jié)都是用文件的每個(gè)字節(jié)都是用ASCIIASCII代碼存放數(shù)據(jù),代碼存放數(shù)據(jù), 即每個(gè)字節(jié)存放一個(gè)字符,這種文件又稱字符文件即每個(gè)字節(jié)存放一個(gè)字符,這種文件又稱字符文件 文件的默認(rèn)打開方式為文本文件文件的默認(rèn)打開方式為文本文件 文本文件是順序存取文件文本文件是順序存取文件 文本文件本身沒有記錄邏輯結(jié)構(gòu),文本文件本身沒有記錄邏輯結(jié)構(gòu), 通常一個(gè)邏輯記通常一個(gè)邏輯記錄用換行符分隔;數(shù)據(jù)項(xiàng)之間可以用空白符、換行錄用換行符分隔;數(shù)據(jù)項(xiàng)之間可以用空白符、換行 符、制表符等分隔。符、制表符等分隔。#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(); /關(guān)閉文件關(guān)閉文件f1.dat
40、 例23.11 有一個(gè)整型數(shù)組,含10個(gè)元素,從鍵盤輸入10個(gè)整數(shù)給數(shù)組,將此數(shù)組送到磁盤文件地f1.dat中存放。文件處理流程文件處理流程定義并打開文件對象定義并打開文件對象打開文件出錯(cuò)處理打開文件出錯(cuò)處理對文件進(jìn)對文件進(jìn)行行R/W操作操作關(guān)閉文件對象關(guān)閉文件對象#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ù)默認(rèn)方式默認(rèn)方式打開文本文件打開文本文件#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ù)值常量做轉(zhuǎn)換做轉(zhuǎn)換#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 文本文件例例: :復(fù)制數(shù)據(jù)到文件復(fù)制數(shù)據(jù)到文件 將文件將文件testtest的內(nèi)容復(fù)制到的內(nèi)容復(fù)制到testnew testnew 中中例例 將數(shù)值將數(shù)值1100及其平方根寫入文件及其平方根寫入文件 sqrttabl
47、e.txt #include #include #includeusing namespace std;void main( ) double x; ofstream out; / 定義一個(gè)輸出流對象定義一個(gè)輸出流對象 out.open(sqrttable.txt); / 打開文本文件打開文本文件sqrttable.txt for(x=1; x=100; x+)outxtsqrt(x)endl; / 將結(jié)果寫入文件將結(jié)果寫入文件 out.close( ); / 關(guān)閉文件關(guān)閉文件例例 編寫一個(gè)程序,用于顯示一個(gè)文本文件編寫一個(gè)程序,用于顯示一個(gè)文本文件 #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) / 讀入一個(gè)字符讀入一個(gè)字符 coutch; / 顯示一個(gè)字符顯示一個(gè)字符例例 從一個(gè)文本文件從
49、一個(gè)文本文件source.txt中讀入若干整數(shù),中讀入若干整數(shù), 用選擇法將這些數(shù)據(jù)排成升序,用選擇法將這些數(shù)據(jù)排成升序, 將排序后的結(jié)果寫入將排序后的結(jié)果寫入 另一個(gè)文件文本文件另一個(gè)文件文本文件target.txt中中事前準(zhǔn)備數(shù)據(jù)文件:事前準(zhǔn)備數(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)結(jié)束后,i是整數(shù)的個(gè)數(shù)sort(a, i ); n=i; for(i=0; in; i+) outaiendl; in.close( ); out.close( );
51、文件讀寫文件讀寫 -二進(jìn)制文件(隨機(jī)存取文件)二進(jìn)制文件(隨機(jī)存取文件) 二進(jìn)制文件以基本類型數(shù)據(jù)在內(nèi)存的二進(jìn)制表示形式二進(jìn)制文件以基本類型數(shù)據(jù)在內(nèi)存的二進(jìn)制表示形式 存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換存放數(shù)據(jù),不對寫入或讀出的數(shù)據(jù)做格式轉(zhuǎn)換 ;打開二進(jìn)制文件用打開二進(jìn)制文件用ios:binaryios:binary方式方式 ;二進(jìn)制文件的讀寫方式由程序控制二進(jìn)制文件的讀寫方式由程序控制 ;二進(jìn)制文件是隨機(jī)存取文件二進(jìn)制文件是隨機(jī)存取文件 。23.4.5 對二進(jìn)制文件的操作若在文件的打開方式中沒有特別說明,打開的文件均為若在文件的打開方式中沒有特別說明,打開的文件均為ASCII碼碼文件,
52、文件,若要打開二進(jìn)制文件,則要特別說明并用特定的讀寫函數(shù)若要打開二進(jìn)制文件,則要特別說明并用特定的讀寫函數(shù)。fstream infile,outfile;infile.open(“inf1.dat”, ios:in| ios:binary);outfile.open(“outf1.dat”, ios:out| ios:binary); 文件名文件名 輸入方式打開輸入方式打開 二進(jìn)制文件二進(jìn)制文件 文件名文件名 輸出方式打開輸出方式打開 二進(jìn)制文件二進(jìn)制文件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 );前三個(gè)為讀取操作前三個(gè)為讀取操作:將第二個(gè)參數(shù)指定的
54、字節(jié)數(shù)讀入到:將第二個(gè)參數(shù)指定的字節(jié)數(shù)讀入到 以第一個(gè)參數(shù)為起始地址的內(nèi)存中。以第一個(gè)參數(shù)為起始地址的內(nèi)存中。 后三個(gè)為寫操作后三個(gè)為寫操作:從第一個(gè)參數(shù)為起始地址的內(nèi)存開始,:從第一個(gè)參數(shù)為起始地址的內(nèi)存開始, 將連續(xù)的第二個(gè)參數(shù)指定字節(jié)數(shù)的將連續(xù)的第二個(gè)參數(shù)指定字節(jié)數(shù)的 內(nèi)容寫到文件中。內(nèi)容寫到文件中。 0 1 2 3 4 5 n-1文件指針文件指針10.5.1 文件和流ios:begios:curios:end二進(jìn)制文件的順序讀寫二進(jìn)制文件的順序讀寫流的狀態(tài)表示:流的內(nèi)容、長度和操作位置流的狀態(tài)表示:流的內(nèi)容、長度和操作位置 ostream 類中兩個(gè)操作字節(jié)數(shù)據(jù)的成員函數(shù)類中兩個(gè)操作字節(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(); 二進(jìn)制文件的順序讀寫二進(jìn)制文件的順序讀寫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 二進(jìn)制文件istream & istream : read ( char * buf , int n ) ;從流中提取從流中提取 n 個(gè)字節(jié)數(shù)據(jù),更新對象個(gè)字節(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) ) ; 注意類型轉(zhuǎn)換注意類型轉(zhuǎn)換二進(jìn)制文件的順序讀寫二進(jìn)制文件的順序讀寫例23.14 將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中。#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( );可以一次輸出整個(gè)數(shù)組到磁盤文件:outfile.write(char*)&stud0, sizeof(stud);n用此方法一次可以輸出一批數(shù)據(jù),效率較高。用此方法一次可以輸出一批數(shù)據(jù),效率較高。n在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加在輸出的數(shù)據(jù)
59、之間不必加入空格,在一次輸出之后也不必加回車換行符?;剀嚀Q行符。n在以后從該文件讀入數(shù)據(jù)時(shí)不是靠空格作為數(shù)據(jù)的間隔,而在以后從該文件讀入數(shù)據(jù)時(shí)不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。是用字節(jié)數(shù)來控制。例23.14 將一批數(shù)據(jù)以二進(jìn)制形式存放在磁盤文件中例23.15 將剛才以二進(jìn)制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。#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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美容院加盟合作協(xié)議書(五年有效期)
- 2025年煙草產(chǎn)品采購合同模板3篇
- 二零二五年度地鐵隧道鋼筋供應(yīng)及安裝服務(wù)合同2篇
- 2025年度國家級科研項(xiàng)目合作勞務(wù)派遣管理協(xié)議3篇
- 二零二五年度文化產(chǎn)業(yè)園開發(fā)與運(yùn)營合同文化產(chǎn)業(yè)3篇
- 2025年度云計(jì)算服務(wù)100%股權(quán)轉(zhuǎn)讓合同3篇
- 代運(yùn)營服務(wù)商2025年度店鋪經(jīng)營狀況評估合同2篇
- 2025年度零擔(dān)運(yùn)輸合同供應(yīng)鏈金融合作合同4篇
- 年度ZNO基變阻器材料產(chǎn)業(yè)分析報(bào)告
- 年度汽油發(fā)動(dòng)機(jī)電控裝置市場分析及競爭策略分析報(bào)告
- 山東省濟(jì)南市2023-2024學(xué)年高二上學(xué)期期末考試化學(xué)試題 附答案
- 大唐電廠采購合同范例
- 國潮風(fēng)中國風(fēng)2025蛇年大吉蛇年模板
- GB/T 18724-2024印刷技術(shù)印刷品與印刷油墨耐各種試劑性的測定
- IEC 62368-1標(biāo)準(zhǔn)解讀-中文
- 15J403-1-樓梯欄桿欄板(一)
- 2024年中考語文名句名篇默寫分類匯編(解析版全國)
- 新煤礦防治水細(xì)則解讀
- 醫(yī)院領(lǐng)導(dǎo)班子集體議事決策制度
- 解讀2024年《學(xué)紀(jì)、知紀(jì)、明紀(jì)、守紀(jì)》全文課件
- 農(nóng)機(jī)維修市場前景分析
評論
0/150
提交評論