C++ open 打開文件(含打開模式一覽表)

在對文件進行讀寫操作之前,先要打開文件。打開文件有以下兩個目的:

  • 通過指定文件名,建立起文件和文件流對象的關聯,以後要對文件進行操作時,就可以通過與之關聯的流對象來進行。
  • 指明文件的使用方式。使用方式有只讀、只寫、既讀又寫、在文件末尾添加數據、以文本方式使用、以二進制方式使用等多種。

打開文件可以通過以下兩種方式進行:

  • 調用流對象的 open 成員函數打開文件。
  • 定義文件流對象時,通過構造函數打開文件。

使用 open 函數打開文件

先看第一種文件打開方式。以 ifstream 類爲例,該類有一個 open 成員函數,其他兩個文件流類也有同樣的 open 成員函數:

void open(const char* szFileName, int mode)

第一個參數是指向文件名的指針第二個參數是文件的打開模式標記
      文件的打開模式標記代表了文件的使用方式,這些標記可以單獨使用,也可以組合使用。表 1 列出了各種模式標記單獨使用時的作用,以及常見的兩種模式標記組合的作用。
 

表1:文件打開模式標記
模式標記 適用對象 作用
ios::in ifstream
fstream
打開文件用於讀取數據。如果文件不存在,則打開出錯。
ios::out ofstream
fstream
打開文件用於寫入數據。如果文件不存在,則新建該文件;如果文件原來就存在,則打開時清除原來的內容。
ios::app ofstream
fstream
打開文件,用於在其尾部添加數據。如果文件不存在,則新建該文件。
ios::ate ifstream 打開一個已有的文件,並將文件讀指針指向文件末尾(讀寫指 的概念後面解釋)。如果文件不存在,則打開出錯。
ios:: trunc ofstream 打開文件時會清空內部存儲的所有數據,單獨使用時與 ios::out 相同。
ios::binary ifstream
ofstream
fstream
以二進制方式打開文件。若不指定此模式,則以文本模式打開。
ios::in | ios::out fstream 打開已存在的文件,既可讀取其內容,也可向其寫入數據。文件剛打開時,原有內容保持不變。如果文件不存在,則打開出錯。
ios::in | ios::out ofstream 打開已存在的文件,可以向其寫入數據。文件剛打開時,原有內容保持不變。如果文件不存在,則打開出錯。
ios::in | ios::out | ios::trunc fstream 打開文件,既可讀取其內容,也可向其寫入數據。如果文件本來就存在,則打開時清除原來的內容;如果文件不存在,則新建該文件。


ios::binary 可以和其他模式標記組合使用,例如:

  • ios::in | ios::binary表示用二進制模式,以讀取的方式打開文件。
  • ios::out | ios::binary表示用二進制模式,以寫入的方式打開文件。


文本方式與二進制方式打開文件的區別其實非常微小,我會在《文件的文本打開方式和二進制打開方式的區別》一節中專門解釋。一般來說,如果處理的是文本文件,那麼用文本方式打開會方便一些。但其實任何文件都可以以二進制方式打開來讀寫。

在流對象上執行 open 成員函數,給出文件名和打開模式,就可以打開文件。判斷文件打開是否成功,可以看“對象名”這個表達式的值是否爲 true,如果爲 true,則表示文件打開成功。

下面的程序演示瞭如何打開文件:


 
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. ifstream inFile;
  7. inFile.open("c:\\tmp\\test.txt", ios::in);
  8. if (inFile) //條件成立,則說明文件打開成功
  9. inFile.close();
  10. else
  11. cout << "test.txt doesn't exist" << endl;
  12. ofstream oFile;
  13. oFile.open("test1.txt", ios::out);
  14. if (!oFile) //條件成立,則說明文件打開出錯
  15. cout << "error 1" << endl;
  16. else
  17. oFile.close();
  18. oFile.open("tmp\\test2.txt", ios::out | ios::in);
  19. if (oFile) //條件成立,則說明文件打開成功
  20. oFile.close();
  21. else
  22. cout << "error 2" << endl;
  23. fstream ioFile;
  24. ioFile.open("..\\test3.txt", ios::out | ios::in | ios::trunc);
  25. if (!ioFile)
  26. cout << "error 3" << endl;
  27. else
  28. ioFile.close();
  29. return 0;
  30. }

調用 open 成員函數時,給出的文件名可以是全路徑的,如第 7 行的c:\\tmp\\test.txt, 指明文件在 c 盤的 tmp 文件夾中;也可以只給出文件名,如第 13 行的test1.txt,這種情況下程序會在當前文件夾(也就是可執行程序所在的文件夾)中尋找要打開的文件。

第 18 行的tmp\\test2.txt給出的是相對路徑,說明 test2.txt 位於當前文件夾的 tmp 子文件夾中。第 24 行的..\\test3.txt也是相對路徑,代表上一層文件夾,此時要到當前文件夾的上一層文件夾中查找 test3.txt。此外,..\\..\\test4.txt..\\tmp\\test4.txt等都是合法的帶相對路徑的文件名。

使用流類的構造函數打開文件

定義流對象時,在構造函數中給出文件名和打開模式也可以打開文件。以 ifstream 類爲例,它有如下構造函數:

ifstream::ifstream (const char* szFileName, int mode = ios::in, int);

第一個參數是指向文件名的指針;第二個參數是打開文件的模式標記,默認值爲ios::in; 第三個參數是整型的,也有默認值,一般極少使用。

在定義流對象時打開文件的示例程序如下(用流類的構造函數打開文件):


 
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. ifstream inFile("c:\\tmp\\test.txt", ios::in);
  7. if (inFile)
  8. inFile.close();
  9. else
  10. cout << "test.txt doesn't exist" << endl;
  11. ofstream oFile("test1.txt", ios::out);
  12. if (!oFile)
  13. cout << "error 1";
  14. else
  15. oFile.close();
  16. fstream oFile2("tmp\\test2.txt", ios::out | ios::in);
  17. if (!oFile2)
  18. cout << "error 2";
  19. else
  20. oFile.close();
  21. return 0;
  22. }

注意,當不再對打開的文件進行任何操作時,應及時調用 close() 成員方法關閉文件。有關該方法的用法,後續會做詳細講解。

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