2012-02-23 81 views
0

下面的代碼將打印的東西到一個文件fstream的將不打印到文件

std::fstream fout ("D_addr.txt", std::fstream::app); 
    fout << pkt->Addr() << std::endl; 
    flush(fout); 
    fout.close(); 

調試時,我看着pkt->Addr(),它具有一定的價值。 fout行被傳遞沒有問題。還創建了文件D_addr.txt。但關閉文件後,文件大小爲零!沒有寫任何東西。

問題在哪裏?

+0

什麼是pkt->地址()的返回類型? – 2012-02-23 09:30:37

+0

它是'typedef uint64_t Addr;' – mahmood 2012-02-23 09:32:32

+1

嘗試檢查流狀態。如果文件無法打開,構造函數會設置'failbit'。您可以使用'fstream :: good'來檢查流是否已準備好進行I/O操作。 – 2012-02-23 09:47:57

回答

4

這不是你的實際代碼,我猜如果是這樣,我會從你的Addr()功能開始。

請注意,fstream::close「關閉當前與該對象關聯的文件,將其與流解除關聯,任何掛起的輸出序列都寫入物理文件中。flush(fout);可以省略。

您還應該指定std::fstream::out標誌。 「如果使用該參數中的任何值調用函數,則會覆蓋默認模式,而不是組合。」因此,而不是std::fstream::app你應該通過std::fstream::app | std::fstream::out

+0

感謝它現在被修復 – mahmood 2012-02-23 10:56:21

2

我想知道如果你沒有使用錯誤的類。如果要寫入文件,請使用std::ofstream,而不是std::fstream。特別是std::ofstream的構造函數在調用rdbuf()->open時強制ios_base::out; std::fstream的構造函數沒有(所以你打開的文件既沒有讀取也沒有寫入權限)。

你可能想檢查錯誤狀態:打開成功,關閉(或刷新)後,所有的寫入成功。這樣做的通常的方法就是:

if (fout) { 
    // All OK... 
} 

if (!fout) { 
    // Something went wrong. 
} 

開放(構造)後,就可以使用fout.is_open(),其中有一個是與問候你正在檢查一點點更明確的優勢。

+0

*「如果構造函數未能成功打開文件,該對象仍然被創建,儘管沒有文件與流緩衝區關聯並且流的失敗位被設置。」* - 他說那個文件'D_addr .txt「被創建,它只是空的。如果構造函數失敗,我猜這個文件不會被創建。 – LihO 2012-02-23 10:14:01

+0

@LihO也許吧。我不確定這個標準是否保證了開放的原子性(儘管我期望它是一個很好的實現)。如果你既不要求讀取也不要寫入訪問權限,那麼標準實際上並沒有多說什麼會發生什麼。 – 2012-02-23 10:38:23

2

首先,flush()fout.close()不作任何傷害,但這裏不需要,因爲當fout被銷燬的文件將被關閉(和沖洗)作爲fstream析構函數的一部分。其次,您應該使用ofstream或者將標誌std::ios::out添加到參數openmode

嘗試沿着線的東西:

{ 
    uint64_t x = 42; 
    std::fstream of("test.txt", std::ios::app); 
    of << x << std::endl; 
} 
+0

注意,'fout.close();'可能會有用,如果他調用一些函數,會導致程序在寫入'fout'後立即終止... – LihO 2012-02-23 10:21:54

+0

當然。完全同意在很多情況下'fout.close'在某些情況下可能會有用。 – 2012-02-23 10:32:39