c++:文件操作1 文件的打开
在程序中,要使用一個文件,先要打開文件后才能讀寫,讀寫完后要關閉。創建一個新文件也要先執行打開(open)操作,然后才能往文件中寫入數據。C++ 文件流類有相應的成員函數來實現打開、讀、寫、關閉等文件操作。
C++ 標準類庫中有三個類可以用于文件操作,它們統稱為文件流類。這三個類是:
- ifstream:用于從文件中讀取數據。
- ofstream:用于向文件中寫人數據。
- fstream:既可用于從文件中讀取數據,又可用于 向文件中寫人數據。
使用這三個類時,程序中需要包含 fstream 頭文件。 C++ 類庫中的流類如下圖所示。
ifstream 類和 fstream 類是從 istream 類派生而來的,因此 ifstream 類擁有 istream 類的全部成員函數。同樣地,ofstream 和 fstream 類也擁有 ostream 類的全部成員函數。這三個類中有一些十分熟悉的成員函數可以使用,如operator <<、 operator >>、peek、ignore、getline、get 等。
----對文件操作
在對文件進行讀寫操作之前,先要打開文件。打開文件有以下兩個目的:
- 通過指定文件名,建立起文件和文件流對象的關聯,以后要對文件進行操作時,就可以通過與之關聯的流對象來進行。
- 指明文件的使用方式。使用方式有只讀、只寫、既讀又寫、在文件末尾添加數據、以文本方式使用、以二進制方式使用等多種。
打開文件可以通過以下兩種方式進行:
- 調用流對象的 open 成員函數打開文件。
- 定義文件流對象時,通過構造函數打開文件。
關閉文件時,調用文件流對象的 close 成員函數即可
------1.使用 open 函數打開文件
先看第一種文件打開方式。以 ifstream 類為例,該類有一個 open 成員函數,其他兩個文件流類也有同樣的 open 成員函數:
void open(const char* szFileName, int mode)
第一個參數是指向文件名的指針,第二個參數是文件的打開模式標記。
文件的打開模式標記代表了文件的使用方式,這些標記可以單獨使用,也可以組合使用。如下列出了各種模式標記單獨使用時的作用,以及常見的兩種模式標記組合的作用。
| 模式標記 | 適用對象 | 作用 |
|---|---|---|
| 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,則表示文件打開成功。
//打開文件
#include <iostream>
#include <fstream>
using namespace std;
int main()
{ifstream inFile; //流類ifstream 建立讀取數據的文件流對象inFile.open("c:\\tmp\\test.txt", ios::in); //調用流對象的 open 成員函數打開準備讀取的
//文件。參數是文件名和打開模式 if (inFile) //判斷流對象名的表達式,若果為真true,條件成立,則說明文件打開成功inFile.close(); //關閉文件時,調用文件流對象的 close 成員函數即可。 elsecout << "test.txt doesn't exist" << endl;ofstream oFile; //流類ofstream 建立寫入數據的文件流對象oFile.open("test1.txt", ios::out); //調用流對象的 open 成員函數打開準備寫入數據的文
//件。參數是文件名和打開模式 if (!oFile) //判斷流對象名的表達式,條件成立(PS:注意此處是!非),則說明文件打開出錯cout << "error 1" << endl;elseoFile.close(); //關閉文件時,調用文件流對象的 close 成員函數即可。oFile.open("tmp\\test2.txt", ios::out | ios::in); //第二個參數打開模式是 打開已存在的
//文件,既可讀取其內容,也可向其寫入數據。文件剛打開時,原有內容保持不變。如果文件不存在,則打開
//出錯。if (oFile) //條件成立,則說明文件打開成功oFile.close();elsecout << "error 2" << endl;fstream ioFile; //流類fstreamioFile.open("..\\test3.txt", ios::out | ios::in | ios::trunc);//第二參數打開模式是 打
//開文件,既可讀取其內容,也可向其寫入數據。如果文件本來就存在,則打開時清除原來的內容;如果文件
//不存在,則新建該文件。if (!ioFile)cout << "error 3" << endl;elseioFile.close();return 0;
}
調用 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等都是合法的帶相對路徑的文件名。?
-----2.使用流類的構造函數打開文件 ? ? (PS:不要忘記什么是構造函數啊!!!在C++中,有一種特殊的成員函數,它的名字和類名相同,沒有返回值,不需要用戶顯式調用(用戶也不能調用),而是在創建對象時自動執行。這種特殊的成員函數就是構造函數(Constructor)。)
定義流對象時,在構造函數中給出文件名和打開模式也可以打開文件。以 ifstream 類(PS不要忘記它的本質是一個類哦)為例,它有如下構造函數:
ifstream::ifstream (const char* szFileName, int mode = ios::in, int);
第一個參數是指向文件名的指針;第二個參數是打開文件的模式標記,默認值為ios::in; 第三個參數是整型的,也有默認值,一般極少使用。
在定義流對象時打開文件的示例程序如下(用流類的構造函數打開文件):
#include <iostream>
#include <fstream>
using namespace std;
int main()
{ifstream inFile("c:\\tmp\\test.txt", ios::in); //流ifstream 直接使用定義流對象打開要讀取數據的文
//件,不要流對象的類下的open()成員函數if (inFile)inFile.close();elsecout << "test.txt doesn't exist" << endl;ofstream oFile("test1.txt", ios::out); //流ofstream 直接使用定義流對象打開要寫入數據的文件,不要流對
//象的類下的open()成員函數if (!oFile)cout << "error 1";elseoFile.close();fstream oFile2("tmp\\test2.txt", ios::out | ios::in); //流fstream同上 此文件即可寫入也可讀取if (!oFile2)cout << "error 2";elseoFile.close();return 0;
}
?
總結
以上是生活随笔為你收集整理的c++:文件操作1 文件的打开的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 容器1 vector
- 下一篇: C++:流