使用 fstream 讀寫同一文件,寫入 "123xyz" 後 getline 讀取,隨後寫入 "abc" 失敗,文件內容未更新。
getline 讀至文件末尾會設置 eofbit。此後流進入錯誤狀態,**任何後續讀寫操作(包括 operator<<)都會被忽略**,直到調用 clear() 重置狀態。
myStream << "123";
myStream << "xyz";
myStream.seekg(0);
myStream.getline(buffer, 100); // 讀到末尾,設置 eofbit
cout << "before insert:" << buffer << endl;
myStream << "abc"; // 此處被忽略,因 eofbit 為 true
// 在寫入前檢查並清除 eofbit
if (myStream.eof()) {
myStream.clear(); // 重置所有錯誤標誌
}
// 若需在文件頭插入,還需重置寫指針
myStream.seekp(0);
myStream << "abc";
eof() 只在**嘗試讀取超過末尾**時置位,正常讀到最後一個字符不置位。clear() 清除 eofbit | failbit | badbit,不移動指針。seekg 移動讀指針,seekp 移動寫指針,二者獨立。fstream 不支持原地插入,通常讀入內存修改後整體覆寫。ifstream 讀、ofstream 寫,避免雙向流狀態糾纏。if (!stream) 及時發現錯誤。