天天看點

C++檔案讀寫打開模式​​​​​​​寫檔案步驟​​​​​​​讀寫操作

打開模式

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();

​​​​​​​讀寫操作

  1. put() 

put()函數向流寫入一個字元,其原型是ofstream &put(char ch),使用也比較簡單,如file1.put('c');就是向流寫一個字元'c'。

  1. 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個字元時終止。

  1. 讀寫資料塊 

  要讀寫二進制資料塊,使用成員函數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();

繼續閱讀