1.標頭檔案:#include
2.主要類:
(1)ofstream (檔案寫操作 ,指的是記憶體寫入儲存裝置 )
(2)ifstream (檔案讀操作,指的是儲存裝置讀取到記憶體中)
(3)fstream (讀寫操作,對開啟的檔案可進行讀寫操作)
1.函式open()
void open ( const
char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );
void open(const wchar_t *_filename,
ios_base::openmode mode= ios_base::in | ios_base::out,
int prot = ios_base::_openprot);
引數:
- filename 操作檔名
- mode 開啟檔案的方式
- prot 開啟檔案的屬性
2.開啟檔案的方式在ios類中定義,有如下幾種方式:
這些方式是能夠進行組合使用的,以「或」運算(「|」)的方式。例如
ofstream out;
out.open("hello.txt", ios:
:in|ios
::out|ios
::binary)
開啟檔案的屬性同樣在ios類中也有定義
很多程式中,可能會碰到ofstream out(「hello.txt」), ifstream in(「…」),fstream foi(「…」)這樣的的使用,並沒有顯式的去呼叫open()函式就進行檔案的操作,直接呼叫了其預設的開啟方式,因為在stream類的建構函式中呼叫了open()函式,並擁有同樣的建構函式,所以在這裡可以直接使用流物件進行檔案的操作,預設方式如下:
"font-family:times new roman;font-size:16px;">
ofstream out("...", ios:
:out);
ifstream in("...", ios:
:in);
fstream foi("...", ios:
:in|ios
::out);
當使用預設方式進行對檔案的操作時,你可以使用成員函式is_open()對檔案是否開啟進行驗證。
1.關閉函式:close();
2.作用:關閉開啟的檔案,釋放記憶體。
1.
// reading a text file
2.#include
3.#include
4.#include
5.6. int main ()
11.while (!in.eof() )
12.
16.return
0;
17. }
18.//結果 在螢幕上輸出
19. this is a
text
file.
1.
// writing on a text file
2.#include
3.int main ()
11.return
0;
12. }
13.//結果: 在out.txt中寫入: this is a text file.
• bad()
如果在讀寫過程中出錯,返回 true 。
例如:當我們要對乙個不是開啟為寫狀態的檔案進行寫入時,或者我們要寫入的裝置沒有剩餘空間的時候。
• fail()
除了與bad() 同樣的情況下會返回 true 以外,加上格式錯誤時也返回true 。
例如當想要讀入乙個整數,而獲得了乙個字母的時候。
• eof()
如果讀檔案到達檔案末尾,返回true。
• good()
這是最通用的:如果呼叫以上任何乙個函式返回true 的話,此函式返回 false 。
• clear()
要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。
1.所有輸入/輸出流物件(i/o streams objects)都有至少乙個流指標:
• ifstream, 類似istream, 有乙個被稱為get pointer的指標,指向下乙個將被讀取的元素。
• ofstream, 類似 ostream, 有乙個指標 put pointer ,指向寫入下乙個元素的位置。
• fstream, 類似 iostream, 同時繼承了get 和 put
2.通過使用以下成員函式來讀出或配置這些指向流中讀寫位置的流指標:
• tellg() 和 tellp()
這兩個成員函式不用傳入引數,返回pos_type 型別的值(根據ansi-c++ 標準) ,就是乙個整數,代表當前get 流指標的位置 (用tellg) 或 put 流指標的位置(用tellp).
• seekg() 和seekp()
這對函式分別用來改變流指標get 和put的位置。兩個函式都被過載為兩種不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用這個原型,流指標被改變為指向從檔案開始計算的乙個絕對位置。要求傳入的引數型別與函式 tellg 和tellp 的返回值型別相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用這個原型可以指定由引數direction決定的乙個具體的指標開始計算的乙個位移(offset)。
位移可以是:
ios::beg 從流開始位置計算的位移
ios::cur 從流指標當前位置開始計算的位移
ios::end 從流末尾處開始計算的位移
流指標 get 和 put 的值對文字檔案(text file)和二進位制檔案(binary file)的計算方法都是不同的,因為文字模式的檔案中某些特殊字元可能被修改。
由於這個原因,建議對以文字檔案模式開啟的檔案總是使用seekg 和 seekp的第一種原型,而且不要對tellg 或 tellp 的返回值進行修改。對二進位制檔案,你可以任意使用這些函式,應該不會有任何意外的行為產生。
以下例子使用這些函式來獲得乙個二進位制檔案的大小:
1.
// obtaining file size
2.#include
3.#include
4.5. const char * filename = "test.txt";
6.7. int main ()
18.19.
//結果:
20. size of example.txt is 40
bytes.
write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );
這裡 buffer 是一塊記憶體的位址,用來儲存或讀出資料。引數size 是乙個整數值,表示要從快取(buffer)中讀出或寫入的字元數。
1.
// reading binary file
2.#include
3.#include
4.5. const char * filename = "test.txt";
6.7. int main ()
22.//執行結果:
23. the complete file is in
a buffer
當我們對檔案流進行操作的時候,它們與乙個streambuf 型別的快取(buffer)聯絡在一起。這個快取(buffer)實際是一塊記憶體空間,作為流(stream)和物理檔案的媒介。例如,對於乙個輸出流, 每次成員函式put (寫乙個單個字元)被呼叫,這個字元不是直接被寫入該輸出流所對應的物理檔案中的,而是首先被插入到該流的快取(buffer)中。
當快取被排放出來(flush)時,它裡面的所有資料或者被寫入物理媒質中(如果是乙個輸出流的話),或者簡單的被抹掉(如果是乙個輸入流的話)。這個過程稱為同步(synchronization)。
它會在以下任一情況下發生:
• 當檔案被關閉時: 在檔案被關閉之前,所有還沒有被完全寫出或讀取的快取都將被同步。
• 當快取buffer 滿時:快取buffers 有一定的空間限制。當快取滿時,它會被自動同步。
• 控制符明確指明:當遇到流中某些特定的控制符時,同步會發生。這些控制符包括:flush 和endl。
• 明確呼叫函式sync(): 呼叫成員函式sync() (無引數)可以引發立即同步。這個函式返回乙個int 值,等於-1 表示流沒有聯絡的快取或操作失敗。
C 檔案操作與C 的檔案操作
c filestream 檔案流 主要用於使用二進位制方式讀寫檔案資料,可讀取任何檔案 建立filestream物件 e 建立filestream物件 filemode 指定系統開啟檔案的方式filestream fileaccess 指定檔案的訪問方式 read唯讀,write只寫,readwri...
C 檔案操作
c 追加檔案 sw.writeline 追逐理想 sw.writeline kzlll sw.writeline net筆記 sw.flush sw.close c 拷貝檔案 string orignfile,newfile file.copy orignfile,newfile,true c 刪除...
C 檔案操作
c 檔案操作 軒軒 發表於 2006 2 18 12 40 16 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 cout 一般情況下就是指的顯示器...