【发布时间】:2017-10-29 02:44:23
【问题描述】:
提出这个问题并不容易,所以对于那里的任何悲伤,我深表歉意.. 我现在正在写入这样的 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) 从现有文件中读取标题行并将其写入新文件,2) 将新行写入文件,以及 3) 读取其余部分原始文件并将其写入新文件。看起来你已经完成了所有这些,已经完成了 95% 的工作。在
SMARfile << SMA[0] << endl;之前,使用std::getline从输入文件中读取标题行,将其写入输出文件,然后......你就完成了。结束。 -
为什么不每次都从头开始重新创建文件?将旧内容读入内存,根据需要修改内存中的副本,将其全部写入新文件,将新文件重命名(无需删除)为旧文件。
-
是的,确实做了很多工作。谢谢你的反馈。我不得不把它归结为睡眠不足......