小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C ++文件流操作

 WUCANADA 2013-06-16

C++文件流操作

分類: C++ 31人閱讀 評(píng)論(0) 收藏 舉報(bào)

文件流操作

所謂文件,一般指存在外部介質(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、打開方式

openmode

功能

ios::app

打開一個(gè)輸出文件,用于將數(shù)據(jù)添加到文件尾部

ios::ate

打開一個(gè)現(xiàn)在文件,把文件指針移動(dòng)文件末尾

ios::binary

以二進(jìn)制方式打開一個(gè)文件,默認(rèn)為文本文件

ios::in

打開一個(gè)文件,以便進(jìn)行輸入操作

ios::out 

打開一個(gè)文件,以便進(jìn)行輸出操作

ios::trunc

打開一個(gè)文件,如果文件已存在,刪除其中全部數(shù)據(jù),如果文件不存在,則建立新文件

ios::nocreate

打開一個(gè)文件,如果文件不存在,則打開失敗

ios::noreplace

打開一個(gè)文件,如果文件存在,則打開失敗

注:新的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ù)成員

iostate值

含義

ios_base::eofbit

已經(jīng)到達(dá)文件尾

ios_base::badbit

流的完整性被破壞

ios_base::failbit

不能讀寫期望的數(shù)據(jù)

ios_base::goodbit

流處理正常的狀態(tài)

同一般數(shù)據(jù)流的操作一樣,文件流也可以通過調(diào)用相應(yīng)的函數(shù)來判斷是否處于某種狀態(tài)。

例如:

eof()——檢測(cè)———>ios_base::badbit

fail()————檢測(cè)————>ios_base::failbit或ios_base::badbit

good()————檢測(cè)————>

ios_base::eofbit

ios_base::badbit

ios_base::failbit

注意:當(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è)試程序:

  1. #include <iostream>  
  2.   
  3. #include <fstream>  
  4.   
  5. #include <string>  
  6.   
  7. using namespace std;  
  8.   
  9. int main()  
  10.   
  11. {  
  12.   
  13.     char buff[4096];//設(shè)置緩沖區(qū)  
  14.   
  15.     //創(chuàng)建一個(gè)輸入流對(duì)象  
  16.   
  17.     ifstream in_file("site.tar",ios::binary);//兩個(gè)流對(duì)象同時(shí)采用二進(jìn)制方式 //拷貝文件名可自行修改  
  18.   
  19.     if(!in_file)  
  20.   
  21.     {  
  22.   
  23.         cout<<"文件不存在!"<<endl;  
  24.   
  25.          exit(0);  
  26.   
  27.     }  
  28.   
  29.     //創(chuàng)建輸出流對(duì)象  
  30.   
  31.     ofstream copy_file("site2.tar",ios::binary|ios::trunc|ios::out); // 若加ios::trunc//與文件創(chuàng)建鏈接,如果文件不存在,則創(chuàng)建文件,文件存在,先刪除原文件再創(chuàng)建  
  32.   
  33.     if(!copy_file)  
  34.   
  35.     {  
  36.   
  37.         cout<<"數(shù)據(jù)復(fù)制失敗"<<endl;  
  38.   
  39.      }  
  40.   
  41.     else  
  42.   
  43.     {  
  44.   
  45.         while(!in_file.eof())//沒有到文件尾  
  46.   
  47.         {  
  48.   
  49.             in_file.read(buff,1024);  
  50.   
  51.             int n=in_file.gcount();//讀取實(shí)際read的字符數(shù)  
  52.   
  53.             copy_file.write(buff,n);  
  54.   
  55.         }  
  56.   
  57.         cout<<"數(shù)據(jù)復(fù)制成功"<<endl;  
  58.   
  59.            
  60.   
  61.     }  
  62.   
  63.     in_file.close();  
  64.   
  65.     copy_file.close();  
  66.   
  67.     return 0;  
  68.   
  69. }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多