頭文件fstream定義了三個類型來支持文件IO:
- ifstream從一個給定文件讀取數據。
- ofstream向一個給定文件寫入數據。
- fstream可以讀寫給定文件。
特別是,我們可以用IO操作符來讀寫文件,可以用getline從一個ifstream讀取數據。
文件輸入輸出
當我們想要讀寫一個文件時,我們有兩種方法。
方式一
我們首先定義一個文件流對象,此文件沒有與任何文件關聯起來,即,空文件流對象。
fstream fstream_object;
如果我們定義了一個空文件流對象,可以隨後調用open函數來將它與文件關聯起來。
每個文件流類都定義了一個名爲open的成員函數,它完成一些系統相關的操作,來定位給定的文件,並視情況打開爲讀或寫模式。
fstream_object.open(s);
實際上,對一個已經打開的文件流調用open函數可能會失敗,並會導致failbit被置位,隨後的試圖使用文件流的操作都會失敗。
由於調用open函數可能失敗,進行open函數是否調用成功的檢測通常是一個好習慣。
if(fstream_object)
一旦一個文件流已經打開,它就保持與對應文件的關聯。
爲了將文件流關聯到另一個文件,我們必須首先關閉已經關聯的文件。
fstream_object.close()
demo如下:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream fstream_object;
fstream_object.open("/home/xjk/CLionProjects/4-23/data.txt");
fstream_object << "no.1 line!" << endl;
fstream_object << "no.2 line!" << endl;
fstream_object.close();
cout << "OK" << endl;
return 0;
}
方式二
除了上面的方法外,當我們想讀寫一個文件時,我們可以定義一個文件流對象,並直接將其與文件關聯起來。
當我們創建文件流對象時,如果我們提供了文件名,則open函數被自動調用。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream fstream_object("/home/xjk/CLionProjects/4-23/data.txt");
fstream_object << "no.1 line!!!" << endl;
fstream_object << "no.2 line!!!" << endl;
fstream_object.close();
cout << "OK" << endl;
return 0;
}
文件模式
每個流都有一個關聯的文件模式,用來指出如何使用文件。
文件模式 | 解釋 |
---|---|
in | 以讀方式打開文件 |
out | 以寫方式打開文件 |
app | 每次寫操作前均定位到文件末尾 |
ate | 打開文件後立即定位到文件末尾 |
trunc | 截斷文件 |
binary | 以二進制方式進行IO |
無論用那種方式打開文件,我們都可以指定文件模式,調用open打開文件可以,用一個文件名初始化流對象來隱式打開文件時也可以。
值得注意的是,默認情況下,即使我們沒有指定trunc,以out模式打開的文件也會被截斷。爲了保留以out模式打開的文件的內容,我們必須同時指定app模式,這樣只會將數據追加寫到文件末尾。