2012-09-20 24 views
0

在調試其他人的代碼時,我遇到了C++的fstream對象,通過流操作符輸入和ios::app之間的交互,這是我以前不知道的。ios :: app和用於輸入的fstream之間的交互

假設file.txt存在幷包含文本數據。原始上下文中的fstream是長期存在的並且用於輸入和輸出。

#include <string> 
#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    fstream f("file.txt", ios::app); 
    string in; 
    f >> in; 
    cout << in << endl; 
    f.close(); 
    return 0; 
} 

更改爲以下文件打開的語句解決該問題:

fstream f("file.txt"); 

預期(沒有提供輸出文件),錯誤處理代碼已被省略下面的代碼無法正常工作這是預期的行爲?如果不能用ios :: app打開一個fstream對象,並希望通過流操作符輸入正確的行爲?

在64位Linux編譯使用g ++ 4.6.3和MinGW-G ++ 4.4.1在32位Windows 7

+0

這個玩具的例子是從墨菲集刪除幾個項目後創建的。 – DuncanACoulter

回答

3

如果檢查std::fstream constructor你會注意到,默認參數爲標誌的位域ios_base::inios_base::out。通過僅提供ios_base::app作爲標誌,可以使該文件僅附加。如果你想要這兩個輸入和追加,那麼你必須使用例如ios::in | ios::app

+0

啊,是的,我意識到這一點,但忽略了考慮fstream(ios :: in | ios :: out)的默認行爲是通過參數的默認值設置的,而不是任何數據成員的當前值存儲選項。在大多數實現中,我想它可能只是存儲參數並用&重新測試以根據需要節省空間。 – DuncanACoulter

相關問題