2017-10-29 18 views
0

その質問を策定するのは容易ではないので、私はそこにすべての悲しみのために申し訳ありません.. 私は、現時点では、このようなCSVファイルに書いています:最後のエントリの後ではなく、最後のエントリの前に、csvファイルにデータを追加します。 C++

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 

私は、ヘッダ(および数を超える)の下でそこに新しいベクタエントリことを絞るの方法がないと思いますが、それは私が達成したいものですとにかく だから私は、既存の出力ファイルを読み込み、ベクトルに入れて、古いファイルを置き換えなければならないと思いますか?私はこのようななめらかで開始:この

より

32.247 
SMA 
32.325 

..rather:

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

....が、ちょうどこのようなヘッダーの上に新しいデータを置くもちろん

SMA 
32.247 
32.325 

私はむしろ、このような時間を費やすような運動にはならないでしょうが、私はこれをどうやってやることができるかについて助けてくれてありがとうと思います。

+2

を正確にあなたがわからない何を:1)2)のファイルに新しい行を書き、既存のファイルからヘッダ行を読み取り、新規ファイルに書き込みます3)残りの元のファイルを読み込んで新しいファイルに書き込む。あなたは既にそのすべてをやっているようです、既に仕事の95%。 'SMARfile << SMA [0] << endl;'の前に 'std :: getline'を使って入力ファイルからヘッダ行を読み込み、出力ファイルに書き出します。終わり。 –

+0

毎回ファイル*を最初から作り直してみませんか?古い内容をメモリに読み込んだり、メモリ内のコピーを修正したり、新しいファイルに書き出したり、新しいファイルを古いファイルとして名前を変更したりする必要はありません。 –

+0

はい、実際には多くの作業が行われました。入力いただきありがとうございます。私はそれを眠りの欠如に置く必要があります... – PushT

答えて

1

入力ファイルの最初の行を読み込むと、そのファイルを使用して新しいファイルを開始することができ、古いデータが開始される2行目にファイルポインタが残ります。そして、あなたはこのように新しいものを書くことができます。

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"); 
} 
+0

私はあなたの答えを役に立つとマークしましたが、それは上記のSam Varshavchikによって上にコメントされたのと全く同じ手順ですので、私は答えとしてマークする必要があります。 。とにかくおかげで、私はgetl​​ineを何度も使ってきましたが、まだ...。 – PushT

関連する問題