下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ofstream的使用方法ofstream是從內(nèi)存到硬盤,ifstream是從硬盤到內(nèi)存,其實(shí)所謂的流緩沖就是內(nèi)存空間;在C+中,有一個(gè)stream這個(gè)類,所有的I/O都以這個(gè) 流”類為基礎(chǔ)的,包括我們要認(rèn)識(shí)的 文件I/O , stream這個(gè)類有兩個(gè)重要的運(yùn)算符:1、插入器(<<)向流輸出數(shù)據(jù)。比如說(shuō)系統(tǒng)有一個(gè)默認(rèn)的標(biāo)準(zhǔn)輸出流(cout), 一般情況下就是指的顯示器,所以,cout<<"Write Stdout"<< 'n'就表示把字符串"Write Stdout"和換行字符(n'輸出到 標(biāo)準(zhǔn)
2、輸出流。2、析取器(>>)從流中輸入數(shù)據(jù)。比如說(shuō)系統(tǒng)有一個(gè)默認(rèn)的標(biāo)準(zhǔn)輸入流(cin),一般情況下就是指的鍵盤,所以,cin>>x;就表示從標(biāo)準(zhǔn)輸入流中讀取一個(gè)指定類型(即變量x的類型)的數(shù)據(jù)。在C+中,對(duì)文件的操作是通過(guò)stream的子類fstream(file stream)來(lái)實(shí)現(xiàn)的,所以,要用這種方式操作文件,就必須加入頭文件fstream.h。下面就把此類的文件操作過(guò)程一一道來(lái)。 一、打開(kāi)文件在fstream類中,有一個(gè)成員函數(shù)open(),就是用來(lái)打開(kāi)文件的,其原型是:void open(const char* filename,int mode,int acc
3、ess);參數(shù):filename :要打開(kāi)的文件名mode:要打開(kāi)文件的方式access:打開(kāi)文件的屬性打開(kāi)文件的方式在類ios(是所有流式I/O類的基類)中定義,常用的值如下:ios:app:以追加的方式打開(kāi)文件ios:ate:文件打開(kāi)后定位到文件尾,ios:app就包含有此屬性ios:binary:以二進(jìn)制方式打開(kāi)文件,缺省的方式是文本方式。兩種方式的區(qū)別見(jiàn)前文ios:in:文件以輸入方式打開(kāi)(文件數(shù)據(jù)輸入到內(nèi)存)ios:out:文件以輸出方式打開(kāi)(內(nèi)存數(shù)據(jù)輸出到文件)ios:nocreate:不建立文件,所以文件不存在時(shí)打開(kāi)失敗 ios:noreplace :不覆蓋文件,所以打開(kāi)文件時(shí)如
4、果文件存在失敗 ios:trunc :如果文件存在,把文件長(zhǎng)度設(shè)為0可以用或“把以上屬性連接起來(lái),如 ios:out|ios:binary打開(kāi)文件的屬性取值是:0:普通文件,打開(kāi)訪問(wèn)1:只讀文件2:隱含文件4:系統(tǒng)文件可以用 或”或者"+把以上屬性連接起來(lái),如3或1|2就是以只讀和隱含屬性打開(kāi)文件。例如:以二進(jìn)制輸入方式打開(kāi)文件c:config.sysfstream file1;file1.open("c:config.sys",ios:binary|ios:in,0);如果open函數(shù)只有文件名一個(gè)參數(shù),則是以讀/寫普通文件打開(kāi),即:file1.open(&qu
5、ot;c:config.sys"); <=> file1.open("c:config.sys",ios:in|ios:out,0);另外,fstream還有和open()一樣的構(gòu)造函數(shù),對(duì)于上例,在定義的時(shí)侯就可以打開(kāi)文 件了:fstream file1("c:config.sys");特別提出的是,fstream 有兩個(gè)子類:ifstream(input file stream) 和 ofstream(outpu file stream) , ifstream默認(rèn)以輸入方式打開(kāi)文件,而 ofstream默認(rèn)以輸出方式 打開(kāi)文件。
6、ifstream file2("c :pdos.de巧;以輸入方式打開(kāi)文件 ofstream file3("c:x.123"); 以輸出方式打開(kāi)文件所以,在實(shí)際應(yīng)用中,根據(jù)需要的不同,選擇不同的類來(lái)定義:如果想以輸入方式打開(kāi), 就用ifstream來(lái)定義;如果想以輸出方式打開(kāi),就用 ofstream來(lái)定義;如果想以輸入/輸出 方式來(lái)打開(kāi),就用 fstream來(lái)定 二、關(guān)閉文件打開(kāi)的文件使用完成后一定要關(guān)閉,fstream提供了成員函數(shù) close()來(lái)完成此操作,如:file1.close();就把file1相連的文件關(guān)閉。三、讀寫文件讀寫文件分為文本文件和二進(jìn)制
7、文件的讀取,對(duì)于文本文件的讀取比較簡(jiǎn)單,用插入器和析取器就可以了;而對(duì)于二進(jìn)制的讀取就要復(fù)雜些,下要就詳細(xì)的介紹這兩種方式1、文本文件的讀寫文本文件的讀寫很簡(jiǎn)單:用插入器(<<)向文件輸出;用析取器(>>)從文件輸入。假設(shè)file1是以輸入方式打開(kāi),file2以輸出打開(kāi)。示例如下:file2<<"I Love Y ou" 向文件寫入字符串"I Love Y ou"int i;file1>>i;/從文件輸入一個(gè)整數(shù)值。這種方式還有一種簡(jiǎn)單的格式化能力,比如可以指定輸出為16進(jìn)制等等,具體的格式有以下一些操縱符
8、功能輸入/輸出dec格式化為十進(jìn)制數(shù)值數(shù)據(jù)輸入和輸出endl輸出一個(gè)換行符并刷新此流輸出ends輸出一個(gè)空字符輸出hex格式化為十六進(jìn)制數(shù)值數(shù)據(jù)輸入和輸出oct格式化為八進(jìn)制數(shù)值數(shù)據(jù)輸入和輸出setpxecision(int p)設(shè)置浮點(diǎn)數(shù)的精度位數(shù)輸出比如要把123當(dāng)作十六進(jìn)制輸出:file1<<hex<<123;要把3.1415926以5位精度輸出: file1<<setpxecision(5)<<3.1415926 。2、二進(jìn)制文件的讀寫 put()put()函數(shù)向流寫入一個(gè)字符,其原型是ofstream &put(char ch)
9、,使用也比較簡(jiǎn)單,如file1.put(就是向漪寫一個(gè)字符c' get()get()函數(shù)比較靈活,有 3種常用的重載形式:一種就是和 put()對(duì)應(yīng)的形式:ifstream &get(char &ch);功能是從流中讀取一個(gè)字符,結(jié) 果保存在引用ch中,如果到文件尾,返回空字符。如 file2.get(x);表示從文件中讀取一個(gè)字 符,并把讀取的字符保存在 x中。另一種重載形式的原型是:int get();這種形式是從流中返回一個(gè)字符,如果到達(dá)文件尾,返回EOF,如x=file2.get();和上例功能是一樣的。還有一種形式的原型是:ifstream &get(
10、char *buf,int num,char del im='n')這種形式把字 符讀入由buf指向的數(shù)組,直到讀入了 num個(gè)字符或遇到了由delim指定的字符,如果沒(méi)使用delim這個(gè)參數(shù),將使用缺省值換行符'n'。例如:file2.get(str1,127, ' )/孰文件中讀取字符到字符串strl,當(dāng)遇到字符'A或讀取了 127個(gè)字符時(shí)終止。讀寫數(shù)據(jù)塊要讀寫二進(jìn)制數(shù)據(jù)塊,使用成員函數(shù) read()和write()成員函數(shù),它們?cè)腿缦拢?read(unsigned char *buf,int num);write(const unsign
11、ed char *buf,int num);read()從文件中讀取num個(gè)字符到buf指向的緩存中,如果在還未讀入 num個(gè)字符時(shí)就 到了文件尾,可以用成員函數(shù) int gcount();來(lái)取得實(shí)際讀取的字符數(shù);而 write()從buf指向 的緩存寫num個(gè)字符到文件中, 值得注意的是緩存的類型是 unsigned char* ,有時(shí)可能需要 類型轉(zhuǎn)換。例:unsigned char str1="I Love 丫 ou" int n5;ifstream in("xxx.xxx");ofstream out("yyy.yyy");o
12、ut.write(str1,strlen(str1);/ 把字符串 str1 全部寫到 yyy.yyy 中in.read(unsigned char*)n,sizeof(n);/ 從 xxx.xxx 中讀取指定個(gè)整數(shù),注意類型轉(zhuǎn)換 in.close();out.close();四、檢測(cè)EOF成員函數(shù)eof()用來(lái)檢測(cè)是否到達(dá)文件尾,如果到達(dá)文件尾返回非0值,否則返回0。原型是 int eof();例: if(in.eof() ShowMessage("已經(jīng)到達(dá)文件尾!");五、文件定位和C的文件操作方式不同的是,C+ I/O系統(tǒng)管理兩個(gè)與一個(gè)文件相聯(lián)系的指針。一個(gè)是讀指針,
13、它說(shuō)明輸入操作在文件中的位置;另一個(gè)是寫指針,它下次寫操作的位置。 每次執(zhí)行輸入或輸出時(shí),相應(yīng)的指針自動(dòng)變化。所以, C+的文件定位分為讀位置和寫位置的定 位,對(duì)應(yīng)的成員函數(shù)是seekg()和seekp()。seekg()是設(shè)置讀位置,seekp是設(shè)置寫位置。它們最通用的形式如下:istream &seekg(streamoff offset,seek_dir origin);ostream &seekp(streamoff offset,seek_dir origin);streamoff定義于iostream.h中,定義有偏移量 0ffset所能取得的最大值, seek_d
14、ir表示 移動(dòng)的基準(zhǔn)位置,是一個(gè)有以下值的枚舉: ios:beg:文件開(kāi)頭ios:cur:文件當(dāng)前位置ios:end:文件結(jié)尾這兩個(gè)函數(shù)一般用于二進(jìn)制文件,因?yàn)槲谋疚募?huì)因?yàn)橄到y(tǒng)對(duì)字符的解釋而可能與預(yù)想 的值不同。例:file1.seekg(1234,ios:cur); /把文件的讀指針從當(dāng)前位置向后移1234個(gè)字節(jié)file2.seekp(1234,ios:beg); /把文件的寫指針從文件開(kāi)頭向后移 1234個(gè)字節(jié) fstream的用法開(kāi)一個(gè)文件fstream f;f.open("1.txt", ios:in | ios:binary);if (!f.is_open()
15、/檢查文件是否成功打開(kāi)cout << "cannot open file." << endl;ios:in與ios:bianry均為int型,定義文件打開(kāi)的方式。ios:in -打開(kāi)文件用于讀。ios:out -打開(kāi)文件用于寫,如果文件不存在,則新建一個(gè);存在則清空其內(nèi)容。ios:binary -以二進(jìn)制bit流方式進(jìn)行讀寫,默認(rèn)是 ios:text,但最好指定這種讀寫方式,即 使要讀寫的是文本。因?yàn)樵?ios:text模式下,在寫入時(shí)n'字符將轉(zhuǎn)換成兩個(gè)字符:回車 + 換行(HEX: 0D 0A)寫入,讀入時(shí)作逆轉(zhuǎn)換,這容易引起不必要的麻煩
16、。ios:app-打開(kāi)文件在文件尾進(jìn)行寫入,即使使用了seekp改變了寫入位置,仍將在文件尾寫入。ios:ate -打開(kāi)文件在文件尾進(jìn)行寫入,但seekp有效。讀寫位置的改變f.seekg(0, ios:beg); / 改變讀入位置 g mean Getf.seekp(0, ios:end); / 改變寫入位置 p mean Put第一個(gè)參數(shù)是偏移量offset(long),第二個(gè)參數(shù)是 0ffset相對(duì)的位置,三個(gè)值:ios:beg -文件頭 ios:end -文件尾 ios:cur - 當(dāng)前位置文件讀寫char s50;f.read(s, 49);s50 = ' 0' /注
17、意要自己加上字符串結(jié)束符char *s = "hello"f.write(s, strlen(s);補(bǔ)充記得讀寫完成后用f.close()關(guān)閉文件。例子下面的程序用于刪除帶有行號(hào)的源程序中的行號(hào)。#include <iostream>#include <fstream>using namespace std;定義要?jiǎng)h除的行號(hào)格式,下面定義的是型如:#0001的行號(hào)const int LINE_NUM_LENGTH = 5;const char LINE_NUM_START = ' #';int main(int argc, char
18、*argv口)fstream f;char *s = NULL;int n;for (int i = 1; i < argc; i+) cout << "Processing file " << argvi << ""f.open(argvi, ios:in | ios:binary); if (!f.is_open()cout << "CANNOT OPEN"<< endl;continue;f.seekg(0, ios:end);n = f.tellg(); / 文件大小s = new charn+1;f.seekg(0, ios:beg);f.read(s, n);sn = ' 0';f.close();/采用一種簡(jiǎn)單的判斷,遇到 LINE_NUM_START后接一個(gè)數(shù)字,/則認(rèn)為它是一個(gè)行號(hào).for (int j = 0; j < n; j+) if (sj = LINE_NUM_START &&(sj+1 >=' 0&&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年配套服務(wù)用房租賃及配套設(shè)施維護(hù)、更新、改造與升級(jí)合同3篇
- 2025年工商股權(quán)質(zhì)押登記與解押一站式辦理合同3篇
- 二零二五年度環(huán)保技術(shù)研發(fā)承包銷售合同4篇
- 二零二五年度婚姻法律咨詢合同:訴訟離婚與協(xié)議離婚選擇策略
- 2025版門樓安全防范系統(tǒng)設(shè)計(jì)與實(shí)施合同4篇
- 二零二五版環(huán)保型排水系統(tǒng)設(shè)計(jì)施工一體化合同4篇
- 2025年度教育培訓(xùn)機(jī)構(gòu)派遣教師勞動(dòng)合同
- 2025年度個(gè)人住房抵押借款合同范本(全新修訂版)2篇
- 2025年度成人外語(yǔ)培訓(xùn)機(jī)構(gòu)課程及教學(xué)資源轉(zhuǎn)讓合同4篇
- 2025年度鋼構(gòu)結(jié)構(gòu)檢測(cè)分包服務(wù)合同
- 腦梗死合并癲癇病人的護(hù)理查房
- 蘇教版四年級(jí)上冊(cè)脫式計(jì)算300題及答案
- 犯罪現(xiàn)場(chǎng)保護(hù)培訓(xùn)課件
- 扣款通知單 采購(gòu)部
- 電除顫操作流程圖
- 湖北教育出版社三年級(jí)下冊(cè)信息技術(shù)教案
- 設(shè)計(jì)基礎(chǔ)全套教學(xué)課件
- IATF16949包裝方案評(píng)審表
- 人教版八年級(jí)美術(shù)下冊(cè)全冊(cè)完整課件
- 1 運(yùn)行方案說(shuō)明
- 北京房地產(chǎn)典當(dāng)合同
評(píng)論
0/150
提交評(píng)論