2013-02-25 105 views
0

對於下面的代碼:當前文件如何被覆蓋?

fstream file("file.txt", ios::in): 

//some code 
//"file" changes here 

file.close(); 
file.clear(); 
file.open("file.txt", ios::out | ios::trunc); 

如何能在最後三行改變,使當前文件沒有關閉,但「重開」一切爲空白?

+1

你究竟想要做什麼,即你的意思是'所有的東西都是空白'?你的問題聽起來像是簡單地刪除和重新創建它會做你想做的。 – us2012 2013-02-25 04:28:22

+0

@ us2012是的,這就像我想完全重新創建該文件,但如果我不需要顯式刪除和重新制作文件,這將是一件好事。 – 2013-02-25 04:35:23

回答

2

如果我正確理解問題,您希望清除文件中的所有內容而不關閉它(即通過設置EOF位置將文件大小設置爲0)。從我所能找到的解決方案來看,這是最有吸引力的。

另一種選擇是使用特定於操作系統的函數來設置文件的結尾,例如Windows上的SetEndOfFile()或POSIX上的truncate()。

如果您只想從文件開頭寫入,Simon的解決方案就可以工作。如果不使用文件結尾設置,則可能會導致垃圾數據超出您寫入的最後位置。

1

可以倒帶文件:放回置入指針到文件的開頭,這樣下次你寫的東西的時候,它會覆蓋該文件的內容。 爲此,您可以使用seekp這樣的:

fstream file("file.txt", ios::in | ios::out); // Note that you now need 
               // to open the file for writing 
//some code 
//"something" changes here 

file.seekp(0); // file is now rewinded 

注意,它不會刪除任何內容。只有當你覆蓋它時要小心。

+0

不會'(ios :: in | ios :: out)&〜ios :: ate'也這樣做? – 2013-03-22 13:19:08

0

我猜你想避免將圍繞「file.txt的」參數,並試圖實現類似

void rewrite(std::ofstream & f) 
{ 
    f.close(); 
    f.clear(); 
    f.open(...); // Reopen the file, but we dont know its filename! 
} 

然而ofstream沒有爲底層流提供的文件名,並沒有提供清除現有數據的方法,所以你有點不幸。 (它確實提供了seekp,它可以讓您將寫入光標放回到文件的開頭,但不會截斷現有內容......)

我要麼只是將文件名傳遞給需要它的函數

void rewrite(std::ostream & f, const std::string & filename) 
{ 
    f.close(); 
    f.clear(); 
    f.open(filename.c_str(), ios::out); 
} 

或者將文件流和文件名打包到類中。

class ReopenableStream 
{ 
    public: 
    std::string filename; 
    std::ofstream f; 

    void reopen() 
    { 
     f.close(); 
     f.clear(); 
     f.open(filename.c_str(), ios::out); 
    } 

    ... 
}; 

如果你覺得在熱心的你可以做ReopenableStream實際上像一個流,讓你可以寫reopenable_stream<<foo;而不是reopenable_stream.f<<foo但IMO,似乎有點小題大做。