C 標準IO庫檔案流模式 ate

2021-10-07 21:22:16 字數 1890 閱讀 5295

輸出檔案流 ofstream

標頭檔案: #include

命名空間:std

一開始想用fstream通過檔案流的方式來替換c語言的檔案操作,原因其實很簡單,用《和》代替 讀寫感覺**更簡單,看的人也更容易理解,那麼問題就出現了:

問題:

fstream在開啟檔案的時候,以ios_base::openmode型別(位掩碼)組合來決定檔案開啟 的方式和後續使用的方式;常用的標誌有以下幾種: in

以讀方式開啟檔案

out以寫方式開啟檔案

ate表示從檔案尾部開始

向檔案尾追加資料

trunc

清除檔案內容

binary

以二進位制方式

分析:

從上面的描述看來,他們確實差不多;繼續向下看:

如果以追加方式開啟檔案,所有向檔案的輸出從當前檔案的尾部開始進行,不必重新定位。即使你修改檔案位置指標不指向檔案尾部,也不會將輸出寫到那裡;

以at-end方式開啟檔案時,檔案起始位置指向檔案尾部,但你可以修改位置指標指向其它位置,輸出則寫到指標指向的位置;

void

()

ofs.close();

cout

<<

"close file!\n"

<<

endl;

}cout

<<

//以追加的方式關聯檔案

那麼,問題就出現了,並沒有如我們所想的,在檔案的尾部挺入內容,而是清空了原內容再寫入;到底是什麼原因呢?查了幾個官方文件對ate的描述都是在檔案的尾部進行操作,那可能是其實的引數會有影響,我們接著向下看,

初始檔案長度:開啟方式trunc(意指清除)設定初始長度為0,與清除檔案內容的作用相同。輸出檔案流的預設開啟方式包括trunc標誌,所以你可以省略trunc標誌,開啟方式out與out|trunc等價。這僅對輸出流成立。對於雙向檔案流,沒有預設的開啟方式。必須明確設定trunc標誌 ,即如果想清除檔案內容,必須設定in|out|trunc;

從上面的內容不難看出,問題出現在開啟的模式:out上面,對輸出檔案流而言,out自帶trunc光環把我們檔案的內容全部清除了,那我們如果去掉out模式,直接 用ate模式 開啟,結果發現仍然和上面一致,並沒有如我們想象中一樣,那要如何才能正確的清除掉trunc標誌呢,特別還是乙個隱性的標誌,他不需要你顯式定義,接著,我又 在書中同頁看到如下一段話:

檔案流內的建構函式和open()函式的開啟方式引數有乙個預設值。對於輸入檔案流,這個預設值是ios::in,對於輸出檔案流,這個預設值是ios::out(與ios::out|ios::trunc等價),而對於雙向檔案流,該值是ios::in|ios::out.為了保證輸出流以輸出方式開啟,輸入流以輸入方式開啟,預設的開啟方式總是隱含的加到方式引數中,這樣就避免了無意中為輸出開啟乙個輸入檔案或為輸入開啟乙個輸出檔案。

總結:

C 流與標準IO庫

流 資料在計算機裝置和記憶體之間移動,其基本單位為字元,故將其形象地稱為流。中把輸入輸出流定義為類,這裡的輸入 輸出是針對記憶體而言的。流類的物件稱為流物件。每個流物件在記憶體中有自己的緩衝區用於暫存資料。流物件不能複製或賦值,但可以將其引用或指向流物件的指標作為函式的引數或者返回值。第四版 中主要...

標準IO庫 開啟流

開啟標準io流函式 include file fopen const char pathname,const char type file freopen const char pathname,const char type,file file fdopen int filedes,const c...

C 流之標準I O流

標準i o流是指對標準輸入裝置 鍵盤 滑鼠等 和標準輸出裝置 顯示器 印表機等 進行輸入輸出的過程。在根基類ios類中定義了3個使用者會經常使用的列舉型別,由於他們是在公用成員部分定義的,所以其中的每個列舉型別常量在加上ios 字首後都可以為本類成員函式和所有外部函式訪問。enum 以下是上述列舉常...