2013-02-18 61 views
0

我想在std::fstream的文件中附加一些文本。我寫了這樣的事情在啓動時清除文件的內容,然後追加

class foo() { 
    foo() {} 
    void print() { 
     std::fstream fout ("/media/c/tables.txt", std::fstream::app| std::fstream::out); 
     // some fout 
    } 
}; 

問題與這種結構是,每次我運行我的程序時,該文本被追加到我以前的運行。例如,在第一次運行結束時,文件大小爲60KB。在第二次運行開始時,文本被附加到60KB文件。

爲了解決這個問題,我想在構造函數中初始化fstream,然後以追加模式打開它。像這樣

class foo() { 
    std::fstream fout; 
    foo() { 
     fout.open("/media/c/tables.txt", std::fstream::out); 
    } 
    void print() { 
     fout.open("/media/c/tables.txt", std::fstream::app); 
     // some fout 
    } 
}; 

此代碼的問題是在執行期間和運行結束時的0大小的文件!

+1

爲什麼你打開/關閉文件每個打印? – user1278743 2013-02-18 15:50:14

+1

只需打開它而不追加。只要文件沒有重新打開,所有後續的寫入都將被相繼寫入。 – hmjd 2013-02-18 15:50:39

+0

我沒有關閉該文件。你推薦什麼? – mahmood 2013-02-18 15:50:59

回答

3

你只需要打開文件一次:

class foo() { 
    std::fstream fout; 
    foo() { 
     fout.open("/media/c/tables.txt", std::fstream::out); 
    } 
    void print() { 
     //write whatever you want to the file 
    } 
    ~foo(){ 
     fout.close() 
    } 
}; 
+0

太糟糕了,這不是一個有效的C++代碼。 – LihO 2013-02-18 16:09:14

0

你的類應該看起來更像是這樣的:

#include <fstream> 

class Writer 
{ 
public: 
    Writer(const char* filename) { of_.open(filename); } 
    ~Writer(){ of_.close(); } 
    void print() { 
     // writing... of_ << "something"; etc. 
     of_.flush(); 
    } 
private: 
    std::ofstream of_; 
}; 

注意,文件流此刻Writer對象是一次開放正在構建並在析構函數close()被調用,它也自動寫入任何待處理的輸出到物理文件。可選地,在每次寫入流之後,您可以撥打flush()以確保輸出儘快送到您的文件。

這個類的可能用法:

{ 
    Writer w("/media/c/tables.txt"); 
    w.print(); 
} // w goes out of scope here, output stream is closed automatically