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