2017-03-18 134 views
0

所以我想輸入文件中的東西,但它似乎並沒有工作。我的代碼是這樣的:std :: ofstream追加文件

ofstream f("reservedTables.DAT"); 
    cin >> table; 
    f.open("reservedTables.DAT", ios::out | ios::app); 
    f << table; 
    f.close(); 

我在做什麼錯?我寫的變量table的編號,但它並沒有出現在我把它放在文件中

回答

0

這是因爲你打開文件兩次。

如果你打電話給open,你實際上打電話給rdbuf()->open(filename, mode | ios_base::out)。請注意(ref):

如果關聯的文件已打開,則立即返回空指針。

由於空指針已被返回,它被分配給內部文件緩衝區,並且不再打開文件。這意味着任何嘗試寫入失敗。

構造已打開文件,如果你指定一個文件名,所以你不需要調用open

std::ofstream f("reservedTables.DAT"); 
std::cin >> table; 
f << table; 
f.close(); 
+0

@ rRakete1111那麼如果我不打開它,當我寫入它的時候如何追加它?對不起,我已經使用fstream了,而且我知道的唯一方法就是當你打開文件 – Roland

+0

@Roland如果你看[構造函數](http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream),你會注意到它也接受默認模式作爲第二個參數。 – Rakete1111

0

快速穿行:

ofstream f("reservedTables.DAT"); 

分配流,並打開該文件。

cin >> table; 

讀取來自用戶的輸入。

f.open("reservedTables.DAT", ios::out | ios::app); 

嘗試重新打開文件。將失敗。

f << table; 

打開失敗並且無法寫入時,流處於失敗狀態。

f.close(); 

關閉文件。

解決方案

只打開一次文件並檢查錯誤。

ofstream f("reservedTables.DAT", ios::app); // no need for ios::out. 
              // Implied by o in ofstream 
cin >> table; 
if (f.is_open()) // make sure file opened before writing 
{ 
    if (!f << table) // make sure file wrote 
    { 
     std::cerr << "Oh snap. Failed write". 
    } 
    f.close(); // may not be needed. f will automatically close when it 
       // goes out of scope 
} 
else 
{ 
    std::cerr << "Oh snap. Failed open". 
} 
+0

謝謝你的回答! – Roland

+0

注意:創建'std :: ofstream'時不需要'ios :: out',因爲它已經是一個輸出流,並且會自己添加'ios :: out'。 Jae。 – Rakete1111

+0

Ja。刪除了錯誤的'ios :: out |'我應該知道比在西方玩最快的槍更好。 – user4581301