Visual C++ 檔案操作

來源:互聯網
上載者:User

CFile類提供了對檔案進行開啟,關閉,讀寫,刪除,重新命名以及擷取檔案資訊等檔案操
作的準系統,足以處理任意類型的檔案操作。
    CFile類是MFC檔案類的基類,支援無緩衝的二進位輸入輸出,也可以通過與CArchive類
的配合使用而支援對MFC對象的帶緩衝的序列化。
    通過CFile類來開啟檔案可以採用兩種方式:一種是先構造一個CFile類對象然後再調用
成員函數Open()開啟檔案,
另一種方法則直接使用CFile類的建構函式去開啟一個檔案。下面語句分別示範了用這兩種
方法開啟磁碟檔案"C:\TestFile.txt"的過程。

    1.先構造一個執行個體,然後再開啟檔案
      CFile file;
      int ret = file.Open("C:\\TestFile.txt", CFile::modeReadWrite);
                 // 報告檔案開啟是否成功
      if (ret == TRUE)
                 AfxMessageBox("檔案開啟成功!");
      else
                 AfxMessageBox("檔案開啟失敗!");
    2.直接通過建構函式開啟檔案
      CFile file("C:\\TestFile.txt", CFile::modeReadWrite);

其中參數CFile::modeReadWrite是開啟檔案的模式標誌,CFile類中與之類次的標誌還有十
幾個,先集中列如下表:

                                            表1 檔案模式標誌
─────────────────────────────────────
                 檔案模式標誌    說明
─────────────────────────────────────
CFile::modeCreate               建立方式開啟檔案,如檔案已存在則將其長度設定為0
─────────────────────────────────────
CFile::modeNoInherit            不允許繼承
─────────────────────────────────────
CFile::modeNoTruncate           建立檔案時如檔案已存在不對其進行截斷
─────────────────────────────────────
CFile::modeRead                 唯讀方式開啟檔案
─────────────────────────────────────
CFile::modeReadWrite            讀寫方式開啟檔案
─────────────────────────────────────
CFile::modeWrite                寫入方式開啟檔案
─────────────────────────────────────
CFile::shareCompat              在使用過程中允許其他進程同時開啟檔案
─────────────────────────────────────
CFile::shareDenyNone            在使用過程中允許其他進程對檔案進行讀寫
─────────────────────────────────────
CFile::shareDenyRead            在使用過程中不允許其他進程對檔案進行讀寫
─────────────────────────────────────
CFile::shareDenyWrite           在使用過程中不允許其他進程對檔案進行寫入
─────────────────────────────────────
CFile::shareExclusive           取消對其他進程的所有訪問
─────────────────────────────────────
CFile::typeBinary               設定檔案為二進位模式
─────────────────────────────────────
CFile::typeText                 設定檔案為文字模式
─────────────────────────────────────

     這些標誌可以通過“或”運算子而同時使用多個,並以此來滿足多種需求。
     如:
     CFile file("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);

     在開啟的檔案不再使用時需要將其關閉,既可以用成員函數Close()關閉也可以通過
CFile類的解構函式來完成。當採取後一種方式時,如果檔案還沒有被關閉,解構函式將
負責隱式調用Close()函數去關閉檔案,這也表明建立在堆上的CFile類對象在超出範圍
後將自動被關閉。由於調用了對象的解構函式,因此在檔案被關閉的同時CFile對象也被
銷毀,而採取Close()方式關閉檔案後,CFile對象仍然存在。所以,在顯式調用Close()
函數關閉一個檔案後可以繼續用同一個CFile對象去開啟其他的檔案。

     檔案讀寫是最常用的檔案操作方式,主要由CFile類成員函數Read(),Write()來實現。
其函數原型分別為:
                 UINT Read(void* lpBuf,UINT nCount);
                 void Write(const void* lpbuf,UINT nCount);
    參數lpBuf為指向存放資料的緩衝的指標,nCount為要讀入或寫入的位元組數,Read()返回
的為實際讀取的位元組數,該數值小於或等於nCount,如果小於nCount則說明已經讀到檔案
末尾,可以結束檔案讀取,如繼續讀取,將返回0。因此通常可以將實際讀取位元組數是否小
於指定讀取的位元組數或是否為0作為判斷檔案讀取是否到達結尾的依據。下面這段代碼示範
了對檔案進行一次性寫入和迴圈多次讀取的處理過程。

                 // 緩衝
                 char WriteBuf[1000];
                 char ReadBuf[100];

                 //建立、寫入方式開啟檔案
                 CFile file;
                 file.Open("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);

                 // 寫入檔案
                 memset(WriteBuf, 'a', sizeof(WriteBuf));
                 file.Write(WriteBuf, sizeof(WriteBuf));

                 file.Close();

                 //唯讀方式開啟檔案
                 file.Open("C:\\TestFile.txt", CFile::modeRead);

                 while (true)
                 {
                               // 讀取檔案資料
                               int ret = file.Read(ReadBuf, 100);
                               ……
                               // 如果到達檔案結尾則中止迴圈
                               if (ret < 100)
                                            break;
                 }//while

                 // 關閉檔案
                 file.Close();

     Write()和Read()函數執行完後將自動移動檔案指標,因此不必再顯式調用Seek()函數
去定位檔案指標。包含有檔案定位函數的完整代碼如下所示:

                 char WriteBuf[1000];
                 char ReadBuf[100];

                 CFile file;
                 file.Open("C:\\TestFile.txt", CFile::modeWrite | CFile::modeCreate);
                 // 寫入檔案
                 memset(WriteBuf, 'a', sizeof(WriteBuf));
                 file.SeekToBegin();
                 file.Write(WriteBuf, sizeof(WriteBuf));

                 file.Close();

                 file.Open("C:\\TestFile.txt", CFile::modeRead);

                 while (true)
                 {
                               //檔案指標
                               static int position=0;
                               //移動檔案指標
                               file.Seek(position,CFile::begin);
                               // 讀取檔案資料
                               int ret = file.Read(ReadBuf, 100);
                               position+=ret;
                               ……
                               // 如果到達檔案結尾則中止迴圈
                               if (ret < 100)
                                            break;
                 }//while

                 file.Close();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.