如何覆盖当前文件?

时间:2013-02-25 04:25:19

标签: c++ file-io fstream

以下代码:

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

//some code
//"file" changes here

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

如何更改最后三行,以便当前文件不会关闭,但“重新打开”,所有内容都被清空?

3 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,你想清除文件的所有内容而不关闭它(即通过设置EOF位置将文件大小设置为0)。从我所能找到的,您提出的解决方案是最吸引人的。

您的另一个选择是使用特定于操作系统的函数来设置文件结尾,例如Windows上的SetEndOfFile()或POSIX上的truncate()。

如果您只想在文件开头写作,那么Simon的解决方案就可以了。在没有设置文件结尾的情况下使用它可能会让您处于垃圾数据超过您写入的最后位置的情况。

答案 1 :(得分:1)

你可以快退文件:将 put指针放回到文件的开头,所以下次你写的东西时,它会覆盖文件的内容。 为此,您可以使用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

请注意,它不会删除任何内容。只有当你覆盖它时才要小心。

答案 2 :(得分: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似乎有点矫枉过正。