對於下面的代碼:當前文件如何被覆蓋?
fstream file("file.txt", ios::in):
//some code
//"file" changes here
file.close();
file.clear();
file.open("file.txt", ios::out | ios::trunc);
如何能在最後三行改變,使當前文件沒有關閉,但「重開」一切爲空白?
對於下面的代碼:當前文件如何被覆蓋?
fstream file("file.txt", ios::in):
//some code
//"file" changes here
file.close();
file.clear();
file.open("file.txt", ios::out | ios::trunc);
如何能在最後三行改變,使當前文件沒有關閉,但「重開」一切爲空白?
如果我正確理解問題,您希望清除文件中的所有內容而不關閉它(即通過設置EOF位置將文件大小設置爲0)。從我所能找到的解決方案來看,這是最有吸引力的。
另一種選擇是使用特定於操作系統的函數來設置文件的結尾,例如Windows上的SetEndOfFile()或POSIX上的truncate()。
如果您只想從文件開頭寫入,Simon的解決方案就可以工作。如果不使用文件結尾設置,則可能會導致垃圾數據超出您寫入的最後位置。
可以倒帶文件:放回置入指針到文件的開頭,這樣下次你寫的東西的時候,它會覆蓋該文件的內容。 爲此,您可以使用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
注意,它不會刪除任何內容。只有當你覆蓋它時要小心。
不會'(ios :: in | ios :: out)&〜ios :: ate'也這樣做? – 2013-03-22 13:19:08
我猜你想避免將圍繞「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,似乎有點小題大做。
你究竟想要做什麼,即你的意思是'所有的東西都是空白'?你的問題聽起來像是簡單地刪除和重新創建它會做你想做的。 – us2012 2013-02-25 04:28:22
@ us2012是的,這就像我想完全重新創建該文件,但如果我不需要顯式刪除和重新制作文件,這將是一件好事。 – 2013-02-25 04:35:23