簡體   English   中英

std :: ofstream是否會截斷或追加默認值?

[英]Does std::ofstream truncate or append by default?

如果在沒有openmode標志的情況下調用std::ofstream構造函數,則默認標志為ios_base::out 但這是否意味着ios_base::truncios_base::app

換句話說,如果您的文件系統中已經有一個非空文件“past.txt”並且您正在調用

std::ofstream stream( "past.txt" );
stream << "new content";

“新內容”是否會附加到“past.txt”的先前內容中,還是會替換先前的內容?

簡短的版本

它默認截斷。


中等版本

標准基本上是意大利面,但它最終歸結為說它相當於說fopen(const char*, "w") (27.9.1.4 [filebuf.members]),然后指向ISO C 7.9標准。

檢查出來為我們提供了§7.19.5.3,“fopen函數”,它指定了傳遞“w”時的行為:

w截斷為零長度或創建用於寫入的文本文件


長版

如果你想自己跟蹤意大利面條,請從27.9.1.11 [ofstream.cons]開始,它將構造函數的行為描述為

效果:構造class basic_ofstream<charT,traits>的對象,使用basic_ostream(&sb )初始化基類並使用basic_filebuf<charT,traits>())初始化sb (27.7.3.2,27.9.1.2),然后調用rdbuf()->open(s, mode|ios_base::out) 如果該函數返回空指針,則調用setstate(failbit)

其中rdbuf()返回basic_filebuf<charT,traits>* (27.9.1.13 [ofstream])

這導致我們27.9.1.1 [filebuf],或更具體地說,27.9.1.4 [filebuf.members],它描述了open函數:

 basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode); 

效果:如果is_open() != false ,則返回空指針。 否則,根據需要初始化filebuf。 然后,它會打開一個文件,如果可能的話,他的名字是NTBS s (如同調用std::fopen(s,modstr) NTBS modstrmode & ~ios_base::ate modstr mode & ~ios_base::ate確定,如表132所示。如果mode不是表中顯示的某些標志組合,則open打開失敗。

NTBS:以空值終止的字節串

表132描述了C ++ ios_base::openmode和C風格stdio字符串之間的等價規則:

 Table 132 — File open modes | | 'ios_base' flag combination | 'stdio' equivalent | | binary | in | out | trunc | app | | | | | + | | | "w" | | etc... | 

這引出了我們在同一頁面上的腳注:

...在<cstdio> (27.9.2)中聲明了函數簽名fopen(const char*, const char*)fseek(FILE*, long, int) )。

可預見地,它將我們發送到27.9.2 [c.files],它提供了幾乎無用的表134,但隨后引用了C標准:

另見:ISO C 7.9,修正案1 4.6.2。

我在這個答案的主要部分談到了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM