最近在研究 C++ I/O 操作.. 在文件流部分卡殼了..原因是沒有 真正瞭解到 文件打開模式組合後的各種含義
在搜索了一大堆基本沒什麼用處的資料後,終於找到一個比較全的組合模式了。
!!需要特別注意的是 ios:in 與ios::out 組合時,在沒有說明ios::trunc 情況下 是不會請空原有記錄的
原文 :http://blog.csdn.net/xxlyyhappy/article/details/6613168
本文在原文基礎上 添加了一些的東西 豐富了文章內容。
打開模式:
in:打開文件時做讀操作;
out:打開文件時做寫操作;
app:在每次寫之前找到文件尾;
ate:打開文件後立即將文件定位在文件尾;(與ios::app存在區別)
trunc:打開文件時清空已存在的文件流;
binary:以二進制模式進行IO操作;(默認時採用的是 文本文件模式)
有效組合:
並不是所有的打開模式都可以同時制定,有些模式組合是沒有意義的,例如: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 對象不提供默認的 文件模式 因此只能自己敲了;
另外對於二進制文件I/O操作。還涉及到一個概念 隨機存取, 它相對於 文本文件的順序存取而言
所謂順序存取 即 按其在文件中的邏輯順序依次存取的,只能從頭往下讀;有點類似堆棧的概念;
而隨機存取則 另闢蹊徑 使得可以直接在流中的任意位置移動;
隨機存取涉及的函數有以下四個:
seekg(...省略參數) (g 爲get)seekp(...省略參數) (p 爲put) tellg(void) ,tellp(void);
對於讀文件 使用seekg() 或者 tellg() (省略了參數)
對於寫文件 使用seekp() 或者 tellp() (省略了參數)
tellg() 和 tellp() 返回當前流位置;
seekg() 和 seekp() 函數用於設置流位置,C++提供兩種版本
1.只有一個參數 seekg( pos) (用於絕對定位):
seekg(16) 移動到流中位置16上 ,注意流位置從0開始;
2.含有兩個參數(用於相對定位):
例如:seekg( -2,ios::end) ,seekg( 4,ios::beg) ,第一個參數是 相對偏移量,ios::end 和 ios::beg 爲流常量 分別意爲 流結尾 和 流開頭 。
-2 (向前移動2個單位),4( 向後移動4個單位)。
seekp() , tellp() 有相同用法 這裏不再累述。