c ++将数据写入文件而不重复

时间:2017-11-01 20:25:46

标签: c++ file

我创建了一些将歌曲数据写入文本文件的方法。 如果文件不存在,则会创建一个新文件。

我遇到的问题是,每次我再次运行应用程序时,它都会附加到文件并复制所有数据。

首先调用此方法

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);
}

2 个答案:

答案 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;
}