[英]Why does std::ofstream truncate without std::ios_base::trunc?
[英]Does std::ofstream truncate or append by default?
如果在沒有openmode
標志的情況下調用std::ofstream
構造函數,則默認標志為ios_base::out
。 但這是否意味着ios_base::trunc
或ios_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截斷為零長度或創建用於寫入的文本文件
效果:構造
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。 然后,它會打開一個文件,如果可能的話,他的名字是NTBSs
(如同調用std::fopen(s,modstr)
NTBSmodstr
由mode & ~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.