關於C++文件讀取

在C++中,對文件的操作是通過stream的子類fstream(file   stream)來實現的,在頭文件 <fstream> 中定義
    一、打開文件
    fstream類的成員函數open(),原形:void   open(const   char   *filename,int   mode,int   access)
filename:打開的文件名字                         mode:打開文件的方式                             access:打開文件的屬性

    打開文件的模式:
in   打開文件做讀操作             out   寫操作,文件會清空             app   在文件尾追加         ate   定位在文件尾
trunc   如果文件存在,把文件尾長度設爲0(清空已存在的文件流)    
nocreate   文件不存在時打開失敗                             noreplace   打開文件如果存在則失敗
binary   以二進制模式進行IO操作

    打開文件的屬性:
0:普通文件,打開訪問                                   1:只讀文件
2:隱藏文件                                                       4:系統文件
可以用“或(|)”或者“+”把以上屬性連接起來
如果open函數只有文件名---一個參數,則以讀/寫普通文件打開
例:file1.open( "c://config.sys "); <======> file1.open( "c://config.sys ",in|out,0);


      二、關閉文件
      fstream提供成員函數close()來操作
     
     
      三、讀寫操作
      1、file2 < <   "I   love   you ";       //向文件寫入字符串“I   love   you”
            int   i;
            file2> > i;                               //從文件讀出一個整數值i
      2、二進制文件的讀寫
            (1)   put()
                    put()函數向流寫入一個字符。原形爲ofstream   &put(char   ch);
                    file1.put( 'c ');就是向流寫一個字符 'c '
            (2)   get()
                    get()函數有三種重載形式:
                        第一種:ifstream   &get(char   &ch):從流中讀取一個字符,結果保存在引用ch中。如果到文件                         尾則返回空字符
                        第二種:file2.get(x);表示從文件中讀取一個字符,保存在x中。達到文件尾則返回EOF
                        第三種:ifstream   &get(char   *buf,int   num,char   delim= '/n ');   把字符讀入由buf指向的數                         組,直到讀入num個字符或遇到由delim指定的字符。如果沒有delim這個參數,就使用默認置                         換行符 '/n '
                       
                       
        四、文件定位
        C++的文件定位分爲讀位置和寫位置的定位
        seekg()設置讀位置                           seekp()設置寫位置
        istream   &seekg(streamoff   offset,seek_dir   origin);
        ostream   &seekp(streamoff   offset,seek_dir   origin);
        offset   偏移量                         seek_dir   移動的基準位置
        seek_dir是值爲枚舉類型:beg   文件開頭;cur   當前位置;end   結尾
        以上兩個函數一般用於二進制文件
        file1.seekg(1234,cur);             //把文件的讀指針從當前位置後移1234個字節
       
       
       
        ifstream   input;
        vector <string> ::const_iterator   iter=files.begin();
        while(   iter!=files.end()   )
        {
    if(   !input   )
    {
      break;
    }
    while(   input> > s   )
    {
      process(s);
    }
    input.close();
    input.clear();                     //打開已存在的流對象,必須在每次偏移循環時關閉和清空
    ++iter;
        }                      
         
         
        每個IO類定義了三個iostate類型的常量值,分別表示特定的位模式:
        badbit標誌着系統級的故障,如無法恢復的讀寫錯誤
        failbit標誌着希望獲得數值型數據而輸入了字符,這種導致設置failbit的問題通常可以修正
        eofbit標誌着遇到文件結束符,此時同時還設置了failbit
       
        流的狀態由bad、fail、eof和good操作揭示。clear和setstate操作用於改變條件成員狀態
int   ival;
//read   cin   and   test   only   for   EOF;loopis   executed   even   if   there   are   other   IO   failures
while(   cin> > ival,cin.eof()   )       //先讀取,然後返回是否到達文件結束
{
  if(   cin.bad()   )
  {
    throw   runtime_error( "IO   stream   corrupted ");
  }
  if(   cin.fail()   )
  {
    cerr < <   "bad   data,try   again ";
    cin.clear(istream::failbit);             //reset   the   stream
    continue;
  }
}
             
        輸入緩衝區的刷新:
        cout < <   "hi " < <flush;                                           //flush   the   buffer;adds   no   data
        cout < <   "hi " < <ends;                                             //insert   a   null,then   flushes   the   buffer
        cout < <   "hi " < <endl;                                             //insert   a   newline,then   flushes   the   buffer
        cout < <   unitbuf < <   "fisrt " < <   "second " < <   nounitbuf;//每次執行完寫操作符後都刷新流              

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章