C++文件流操作文件流操作所謂文件,一般指存在外部介質(zhì)上的數(shù)據(jù)的集合。根據(jù)數(shù)據(jù)組織形式,C++將其分為 文本文件和二進(jìn)制文件。 文本文件又稱ASCII文件,它的每個(gè)字節(jié)存放一個(gè)ASCII碼。 代表一個(gè)字符,在內(nèi)存和外設(shè)上的文件流傳輸需要經(jīng)過類型轉(zhuǎn)換,將內(nèi)存中的值轉(zhuǎn)換為 對(duì)應(yīng)的ASCII碼,再存放到外設(shè)中。 二進(jìn)制文件,則是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的存儲(chǔ)形式原樣寫到磁盤上存放,不 作任何轉(zhuǎn)換。 ASCII編碼格式的用:fstream ifstream ofstream 類處理 Unicode編碼格式的用:wfstream wifstream wofstream類處理 文件流的基本操作:1、打開文件 2、讀取數(shù)據(jù) 3、處理數(shù)據(jù) 4、數(shù)據(jù)寫回 5、關(guān)閉文件 一、打開文件 實(shí)質(zhì):在內(nèi)存中建立起一個(gè)數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)與文件相對(duì)應(yīng),包括文件的名稱 、起始位置、大小、當(dāng)前讀寫位置等。 用文件流類打開文件有兩種方式:1、調(diào)用類的構(gòu)造函數(shù) 2、調(diào)用成員函數(shù)open 1、構(gòu)造函數(shù)的種類 所有的文件流類都有兩個(gè)版本的構(gòu)造函數(shù) fstream的構(gòu)造函數(shù) fstream(); explicit fstream(const char * filename, ios_base::openmode mode=ios_base::in|ios_base::out); ifstream的構(gòu)造函數(shù) ifstream(); explicit ifstream(const char * filename, ios_base::openmode mode=ios_base::in); ofstream的構(gòu)造函數(shù) ofstream(); explicit ofstream(const char * filename, ios_base::openmode mode=ios_base::out); 注: 帶參數(shù)的是直接打開目標(biāo)文件(只可處理該文件,不可替換打開其它文件) 不帶參數(shù)的意味著目標(biāo)文件還沒有確定,可以使用open函數(shù)指定,open 參數(shù)表與上面的參數(shù)表相同, 打開新文件之前,需要執(zhí)行close關(guān)閉原來的文件,否則open會(huì)調(diào)用返回失敗。 文件流對(duì)象.fali( );測(cè)試是否打開成功。 2、打開方式
注:新的C++類庫,不再提供 nocreate noreplace,可使用“ | ”,來組合打開方式 而且只有binary 才能指定是二進(jìn)制文件。 二、數(shù)據(jù)操作(讀取,處理,寫回) 1、格式化讀寫(或者稱直接文本讀寫,使用 << >> 直接讀取和寫入普通字符) 一般用于默認(rèn)打式方式(文本文件打開方式)的處理,如: 輸出文件流對(duì)象<<”Hello World!”;這面的終端是文件,而不是屏幕 輸入文件流對(duì)象>>var; 將文件中的文本讀取到變量var中。 這里是按文本格式輸入輸出,中間有格式的轉(zhuǎn)換。 2、無格式讀寫 istream中定義的成員函數(shù) int get(char c);每次讀取一個(gè)字節(jié)(字符) read(char * buff , int len);每次讀取len個(gè)字節(jié)(字符)到buff中 ostream中定義的成員函數(shù) int put(char c);每次向文件寫入一個(gè)字節(jié)(字符) wirte(const char * buff , int len );每次向文件寫入buff中前l(fā)en個(gè)字節(jié)(字符) 有多個(gè)重載版本。 三、文件流的狀態(tài)判斷 1、檢測(cè)文件結(jié)束 函數(shù)原型: int eof(); 如果返回0,則表示到了文件流尾。 2、文件是否成功打開 bool is_open();如果返回true,則表示成功打開 3、文件流的狀態(tài) 有4種基本狀態(tài),四個(gè)靜態(tài)數(shù)據(jù)成員
同一般數(shù)據(jù)流的操作一樣,文件流也可以通過調(diào)用相應(yīng)的函數(shù)來判斷是否處于某種狀態(tài)。 例如: eof()——檢測(cè)———>ios_base::badbit fail()————檢測(cè)————>ios_base::failbit或ios_base::badbit good()————檢測(cè)————>
注意:當(dāng)用同一個(gè)文件流對(duì)象處理不同的文件時(shí),需要清除前一個(gè)文件操作留下的狀態(tài)值,使用clear();,否則在后面處理時(shí)進(jìn)行狀態(tài)判斷會(huì)導(dǎo)致意外的結(jié)果。 四、重定位文件讀寫位置 類istream提供了3個(gè)成員函數(shù)來對(duì)讀指針進(jìn)行操作 tellg(); 返回輸入文件讀指針的當(dāng)前位置 seekg(文件中的位置); 將輸入文件中讀指針移到指定的位置 seekg(位移量,參照位置); 以參照位置為基準(zhǔn)移動(dòng)若干字節(jié) 類ostream提供了3個(gè)成員函數(shù)來對(duì)寫指針進(jìn)行操作 tellp(); 返回輸出文件寫指針的當(dāng)前位置 seekp(文件中的位置); 將輸出文件中寫指針移動(dòng)指定的位置 seekp(位移量,參照位置); 以參照位置為基準(zhǔn)移動(dòng)若干字節(jié) 注:文件中的位置和位移量 都是long型整數(shù),以字節(jié)為單位, 參照位置可以是下面三者之一: ios::beg 文件開頭 ios::cur 文件指針當(dāng)前位置 ios::end 文件末尾 如果位移量為正,則向后,為負(fù)則向前。 如果是fstream對(duì)象,則可以任意使用這些函數(shù)。 五、關(guān)閉文件 成員函數(shù): close(); 測(cè)試程序:
|
|
|