我想将数据附加到像这样的函数中的文件:
void Fill( string fileName ){
ofstream outputFile(fileName, ofstream::out | ofstream::app);
outputFile << data1 << " " << data2 << endl;
outputFile.close();
}
如果满足某些条件,则此函数将在循环中用于写入不同的文件。但是我想在程序运行时从空文件开始,即不要附加到旧数据。我怎样才能做到这一点? 希望我明白这一点。 谢谢!
答案 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;