我创建了一些将歌曲数据写入文本文件的方法。 如果文件不存在,则会创建一个新文件。
我遇到的问题是,每次我再次运行应用程序时,它都会附加到文件并复制所有数据。
首先调用此方法
void SongLibrary::SaveAllToFile(string fileName)
{
for (Song song : m_songs)
{
WriteToFile(song.ToFileString(),fileName);
}
}
为每个歌曲对象调用此方法
void SongLibrary::WriteToFile(string data, string fileName)
{
if (FileExists(fileName))
{
ofstream outfile;
outfile.open(fileName, ios::app);
outfile << data;
outfile.close();
}
else
{
CreateFile(fileName);
WriteToFile(data, fileName);
}
}
此方法会创建一个文件
void SongLibrary::CreateFile(string fileName)
{
ofstream outfile(fileName);
outfile.close();
}
此方法检查文件是否存在
inline bool SongLibrary::FileExists(const string& fileName)
{
struct stat buffer;
return (stat(fileName.c_str(), &buffer) == 0);
}
答案 0 :(得分:2)
您需要打开一次文件并写入同一个流对象。如果没有ios::app
参数,它将在文件打开后进行截断。此外,您不需要close()
std::ofstream
因为它在析构函数中自动关闭。
void SongLibrary::SaveAllToFile(const std::string& filename)
{
std::ofstream outfile(filename);
for(auto& song: m_songs)
outfile << song.ToFileString();
}
答案 1 :(得分:1)
每次你在其中写一些内容时都不应该打开/关闭文件,就像你在WriteToFile
函数中所做的那样(在追加模式下)
只需创建一个ofstream
对象,然后将其传递给WriteToFile
这样的功能。
void SongLibrary::SaveAllToFile(string fileName)
{
ofstream outfile(filename);
for (Song song : m_songs)
{
WriteToFile(song.ToFileString(),outfile);
}
outfile.close();
}
并更改您的WriteToFile
函数以处理此对象:
void SongLibrary::WriteToFile(string data, ofstream& outfile)
{
outfile << data;
}