使用C ++将数据附加到文件,但如果重新执行该程序则覆盖

时间:2016-11-29 19:06:53

标签: c++ append ofstream

我想将数据附加到像这样的函数中的文件:

void Fill( string fileName ){
  ofstream outputFile(fileName, ofstream::out | ofstream::app);
  outputFile << data1 << " " << data2 << endl;
  outputFile.close();
}

如果满足某些条件,则此函数将在循环中用于写入不同的文件。但是我想在程序运行时从空文件开始,即不要附加到旧数据。我怎样才能做到这一点? 希望我明白这一点。 谢谢!

3 个答案:

答案 0 :(得分:0)

您传递给函数的ofstream::app参数表示您想要附加到文件(如果该文件已存在)。您正在寻找默认行为。删除那部分,

所以:

ofstream outputFile(fileName, ofstream::out);

答案 1 :(得分:0)

使用ofstream::trunc打开文件,然后稍后将该文件流传递给Fill函数(而不是文件名字符串)以附加新数据。

这是一个不完整的例子:

void Fill(ofstream& outputFile) {
  outputFile << data1 << " " << data2 << endl;
}

int main() {
  ofstream outputFile(fileName, ofstream::out | ofstream::trunc);
  Fill(outputFile);
  outputFile.close();
}

(这假设您将其他数据写入其他位置的文件。如果您只是从Fill函数触摸此文件,那么David的答案就是从{{1}中删除ofstream::app好多了。

答案 2 :(得分:0)

最简单的解决方案是打开程序使用的所有文件而不使用std :: ofstream :: app作为一个函数,在开头调用一次以截断它们。

void resetFiles()
{
    static char * fileNames[] = {
        // Fill this with filenames of the files you want to truncate
    };

    for( int i = 0; i < sizeof( fileNames ) / sizeof( fileNames[ 0 ] ); ++i )
        std::ofstream( fileNames[ i ] );
}

int main( int argc, char ** argv )
{
    resetFiles();

    ...
}

编辑:既然你确实指明了你正在寻找更优雅的解决方案,那么这就是我想出来的。基本上你声明一个新的类继承自std :: ofstream with static std :: map&lt; std :: string,bool&gt;会员叫记录。您添加了一个允许您指定文件名的构造函数。然后通过检查记录中是否存在密钥fileName来查找文件是否已经打开过一次。如果没有,它将使用std :: ofstream :: trunc打开它,并将record [fileName]设置为true。这样,当文件第二次打开时,它知道必须用std :: ofstream :: app打开它。

class OutFile : public std::ofstream
{
    static std::map< std::string, bool > record;

    // Helper function
    static std::ios_base::openmode hasBeenOpened( std::string fileName )
    {
        // Test if the key is present
        if( record.find( fileName ) == record.end() )
        {
            record[ fileName ] = true;
            return std::ofstream::trunc;
        }
        else
        {
            return std::ofstream::app;
        }
    }

public:
    OutFile( const char * filename )
    : std::ofstream( filename, hasBeenOpened( std::string( filename ) ) ) {}
};

// Don't forget to initialize record
map< std::string, bool > OutFile::record;