在C++中與讀取文件和寫入文件簡單操作有關的類分別有ifstream(文件讀入)、ofstream(文件寫出)、fstream (文件讀入和寫出)。
| 名稱 | 作用 |
|---|---|
| ifstream | 文件讀入 |
| ofstream | 文件寫出 |
| fstream | 文件讀入和寫出 |
對於文件操作操作輸入輸出類中具有一個open的函數用來打開文件使用的。其原型為:
void open(const char* filename,int mode,int access);
其中各個參數的含義如下表:
| 參數 | 作用 |
|---|---|
| filename | 需要打開的文件地址名稱 |
| mode | 打開文件的方式 |
| access | 打開文件的屬性 |
其中打開文件的方式在類中ios中定義的常用值為下表,在使用過程中可以用“|”把以上屬性連接起來表或的關系,如ios::out|ios::binary
| mode常用的值 | 作用 |
|---|---|
| ios::app | 以追加的方式打開文件 |
| ios::ate | 文件打開后定位到文件尾,ios:app就包含有此屬性 |
| ios::binary | 以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文 |
| ios::in | 文件以輸入方式打開(文件數據輸入到內存) |
| ios::out | 文件以輸出方式打開(內存數據輸出到文件) |
| ios::nocreate | 不建立文件,所以文件不存在時打開失敗 |
| ios::noreplace | 不覆蓋文件,所以打開文件時如果文件存在失敗 |
| ios::trunc | 如果文件存在,把文件長度設為0 |
打開文件的屬性取值是:
| access常用的值 | 作用 |
|---|---|
| 0 | 普通文件,打開訪問 |
| 1 | 只讀文件 |
| 2 | 隱含文件 |
| 4 | 系統文件 |
再打開文件的過程中,僅需要調用open函數就可以打開文件並對文件內容進行操作。如
查看代碼
ofstream myfile("F:\\zmxs\\date.txt",ios::app);
myfile<<"寫入!"<<endl;
myfile.close();
由上面可以看出在寫入和寫出時,用到了一個重要的運算符插入器(<<)。其實在stream類中存在兩個重要的運算分別是插入器(<<)和析取器(>>)在c++中cin和cout經常可以被看到它主要實現的I/O操作。下面對插入器和析取器進行解釋:
1、插入器(<<)
向流輸出數據。比如說系統有一個默認的標准輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和換行字符('\n')輸出到標准輸出流。
2、析取器(>>)
從流中輸入數據。比如說系統有一個默認的標准輸入流(cin),一般情況下就是指的鍵盤,所以,cin>>x;就表示從標准輸入流中讀取一個指定類型的數據。
同時文件操作完成后需要對文件進行關閉,讓文件進行保存。使用myfile.close();myfile為你定義這個操作名稱。
使用者在操作O的時候,常常使用到文件指針,通俗來講就是你在編輯文本文件時插入文本的位置,被稱為文件指針。對文件指針的位置我們可以通過seekg函數進行操作
文件指針位置在c++中的用法:
| seekg常用的值 | 含義 |
|---|---|
| ios::beg | 文件頭 |
| ios::end | 文件尾 |
| ios::cur | 當前位置 |
舉個栗子:
file.seekg(0,ios::beg); //讓文件指針定位到文件開頭
file.seekg(0,ios::end); //讓文件指針定位到文件末尾
file.seekg(10,ios::cur); //讓文件指針從當前位置向文件末方向移動10個字節
file.seekg(-10,ios::cur); //讓文件指針從當前位置向文件開始方向移動10個字節
file.seekg(10,ios::beg); //讓文件指針定位到離文件開頭10個字節的位置
常用的錯誤判斷方法:
good() 如果文件打開成功
bad() 打開文件時發生錯誤
eof() 到達文件尾
文件操作的代碼解釋
查看代碼
#include<iostream>
#include <string>
#include<fstream>
#include<istream>
using namespace std;
int main()
{
ofstream outfile("F:\\zmxs\\date.txt",ios::app);
if(outfile.good())
{
outfile<<"寫入!"<<endl;
outfile.close();
}
string temp;
ifstream myfile("F:\\zmxs\\date.txt");
///直接使用while會讀取不到第一行
do
{
myfile >> temp;
cout<<temp<<endl;
}while(getline(myfile,temp));
myfile.close();
}
