在最后一个条目之前而不是在最后一个条目之后将数据附加到csv文件。 C ++

时间:2017-10-29 02:44:24

标签: c++ csv ifstream ofstream

不容易提出这个问题,所以我很抱歉有任何悲伤...... 我现在正在写这样的csv文件:

double indicators::SMACurrentWrite() {

if ( !boost::filesystem::exists( "./CalculatedOutput/SMAcurrent.csv" ) ) // std::cout << "Can't find my file!" << std::endl;
    {
        std::ofstream SMAfile;              
        SMAfile.open("./CalculatedOutput/SMAcurrent.csv");
        SMAfile << "SMA" << endl << SMA[0] << endl; // .. or with '\n' at the end.
        SMAfile.close();
    }
else    {   
        std::ofstream SMAfile;
        SMAfile.open ("./CalculatedOutput/SMAcurrent.csv", ios::app); // Append mode
    SMAfile << SMA[0] << endl; // Writing data to file
SMAfile.close();
}
return 0;
}

每次运行应用程序时,最后都会在输出文件中附加一个新值:

SMA
32.325

我想没有办法只是在标题下面(和数字上)挤压那个新的矢量条目,但这就是我想要完成的事情。 所以我想我必须重新读取现有的输出文件,把它放在一个向量中,然后替换旧文件?我从这个开始就像这样:

double indicators::SMACurrentWrite() {

if ( !boost::filesystem::exists( "./CalculatedOutput/SMAcurrent.csv" ) ) // std::cout << "Can't find my file!" << std::endl;
    {
        std::ofstream SMAfile;              
        SMAfile.open("./CalculatedOutput/SMAcurrent.csv", ios::app);
        SMAfile << "SMA" << endl << SMA[0] << endl; // .. or with '\n' at the end.
        SMAfile.close();
    }
else    {   
        std::ofstream SMARfile("./CalculatedOutput/SMAReplacecurrent.csv");
        std::ifstream SMAfile("./CalculatedOutput/SMAcurrent.csv");

            SMARfile << SMA[0] << endl; // Writing data to file
        SMARfile << SMAfile.rdbuf();

        SMAfile.close();
        SMARfile.close();
        std::remove("./CalculatedOutput/SMAcurrent.csv");
            std::rename("./CalculatedOutput/SMAReplacecurrent.csv","./CalculatedOutput/SMAcurrent.csv");
}
return 0;
}

....,但当然只是将新数据放在标题之上:

32.247
SMA
32.325

..而不是这个

SMA
32.247
32.325

我希望这不会成为一项耗时的练习,但我对如何完成这项工作表示感谢。

1 个答案:

答案 0 :(得分:1)

如果从输入文件中读取第一行,则可以使用它来启动新文件,并将文件指针保留在旧数据开始的第二行。然后你可以写下这样的新东西:

if(!boost::filesystem::exists("./CalculatedOutput/SMAcurrent.csv"))
{
    std::ofstream SMAfile;
    SMAfile.open("./CalculatedOutput/SMAcurrent.csv", ios::app);
    SMAfile << "SMA" << '\n' << SMA[0] << '\n';
    SMAfile.close();
}
else
{
    std::ofstream SMARfile("./CalculatedOutput/SMAReplacecurrent.csv");
    std::ifstream SMAfile("./CalculatedOutput/SMAcurrent.csv");

    // first read header from input file

    std::string header;
    std::getline(SMAfile, header);

    // Next write out the header followed by the new data
    // then everything else

    SMARfile << header << '\n';  // Writing header
    SMARfile << SMA[0] << '\n';  // Write new data after header
    SMARfile << SMAfile.rdbuf(); // Write rest of data

    SMAfile.close();
    SMARfile.close();
    std::remove("./CalculatedOutput/SMAcurrent.csv");
    std::rename("./CalculatedOutput/SMAReplacecurrent.csv",
        "./CalculatedOutput/SMAcurrent.csv");
}