打開模式
in:打開檔案時做讀操作;
out:打開檔案時做寫操作;
app:在每次寫之前找到檔案尾;
ate:打開檔案後立即将檔案定位在檔案尾;(與ios::app存在差別)
trunc:打開檔案時清空已存在的檔案流;
binary:以二進制模式進行IO操作;(預設時采用的是 文本檔案模式)
ios::out 寫打開檔案,無檔案則建立,有則清空原檔案
ios::in 讀打開檔案,無檔案則打開失敗,有則打開檔案,不清空檔案
ios::in|ios::out 讀寫打開檔案,無則打開失敗,有則不清空打開;檔案指針在開頭
ios::in|ios::app 讀寫打開檔案,無則建立,有則打開,不清空,檔案指針在開頭,但隻能在檔案尾寫
ios::out|ios::app 寫打開檔案,無則建立,有則打開,不清空,檔案指針在開頭,但隻能在檔案尾寫,不能讀
有效組合:
并不是所有的打開模式都可以同時制定,有些模式組合是沒有意義的,例如:in和trunc,準備讀取檔案流,但是trunc清空了檔案流。
out:打開檔案時做寫操作,删除已經存在的資料;
out | app:打開檔案時做寫操作,在檔案尾寫入,不清空已經存在的資料;
out | trunc:打開檔案時做寫操作,删除已經存在的資料,與out模式相同;(之是以相同 是因為預設的構造函數就是用 ios::out|ios|trunc)
in:打開檔案時做讀操作;
in | out打開檔案時做讀寫操作,并定位于檔案的開頭處,不清空已經存在的資料;
in | out | trunc:打開檔案時做讀寫操作,删除檔案中已經有的資料;
當檔案同時以in out模式打開時,不會清空已有資料;
如果隻使用了out,而沒有指定in模式,則會清空已有資料;
如果使用了trunc,不論是否使用了in,都會清空已有的資料(前提是有ios::out);
ifstream 對象 提供預設 檔案模式 ios::in;
ofstream 對象提供預設 檔案模式 ios::out|ios::trunc;
fstream 對象不提供預設的 檔案模式 是以隻能自己敲了;
寫檔案步驟
1包含頭檔案
#include <fstream>
2建立流對象
ofstream ofs;
3打開檔案
ofs.open("檔案路徑",打開方式);
4寫資料
ofs << "寫入的資料";
5關閉檔案
ofs.close();
讀寫操作
- put()
put()函數向流寫入一個字元,其原型是ofstream &put(char ch),使用也比較簡單,如file1.put('c');就是向流寫一個字元'c'。
- get()
get()函數比較靈活,有3種常用的重載形式:
1.一種就是和put()對應的形式:ifstream &get(char &ch);功能是從流中讀取一個字元,結果儲存在引用ch中,如果到檔案尾,傳回空字元。如file2.get(x);表示從檔案中讀取一個字元,并把讀取的字元儲存在x中。
2.另一種重載形式的原型是: int get();這種形式是從流中傳回一個字元,如果到達檔案尾,傳回EOF,如x=file2.get();和上例功能是一樣的。
3.還有一種形式的原型是:ifstream &get(char *buf,int num,char delim='/n');這種形式把字元讀入由 buf 指向的數組,直到讀入了 num 個字元或遇到了由 delim 指定的字元,如果沒使用 delim 這個參數,将使用預設值換行符'/n'。例如:
file2.get(str1,127,'A');//從檔案中讀取字元到字元串str1,當遇到字元'A'或讀取了127個字元時終止。
- 讀寫資料塊
要讀寫二進制資料塊,使用成員函數read()和write()成員函數,它們原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()從檔案中讀取 num 個位元組到 buf 指向的緩存中,如果在還未讀入 num 個字元時就到了檔案尾,可以用成員函數 int gcount();來取得實際讀取的字元數;而 write() 從buf 指向的緩存寫 num 個字元到檔案中,值得注意的是緩存的類型是 unsigned char *,有時可能需要類型轉換。
例:
unsigned char str1[]="I Love You";
int n[5];
ifstream in("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str1,strlen(str1));//把字元串str1全部寫到yyy.yyy中
in.read((unsigned char*)n,sizeof(n));//從xxx.xxx中讀取指定個整數,注意類型轉換
in.close();out.close();