1

これは私の最初の投稿ですので、ご容赦ください。

答えを求めてインターネットで高低を検索しましたが、問題を解決できなかったため、ここに投稿することにしました。

C++ と JZON を​​使用して、毎秒 1 回の書き込み間隔で、ファイル上の JSON 配列に書き込み (追加) しようとしています。JSON ファイルは、最初に「Prepare」関数によって書き込まれます。次に、別の関数が毎秒呼び出され、配列が JSON ファイルに追加され、新しいオブジェクトが毎秒配列に追加されます。

私は多くのことを試しましたが、そのほとんどがあらゆる種類の問題を引き起こしました。私の最新の試みは私に最高の結果をもたらしました.これは私が以下に含めたコードです. ただし、毎秒配列全体を書き込んでいるため、私が取ったアプローチは非常に非効率的です。これは、アレイが大きくなるにつれて CPU 使用率に大きな打撃を与えていますが、最初に予想したほどメモリには影響しません。

私が本当にできるようにしたいのは、ディスク上の JSON ファイルに含まれる既存の配列に行ごとに追加することです。JSON オブジェクトから配列全体をクリアしてファイル全体を毎回書き換える必要はありません。 2番目。

このウェブサイトの天才の何人かが私を正しい方向に向けることができることを願っています.

事前にどうもありがとうございました。

これが私のコードです:

//Create some object somewhere at the top of the cpp file
Jzon::Object jsonFlight;
Jzon::Array jsonFlightPath;
Jzon::Object jsonCoordinates;
int PrepareFlight(const char* jsonfilename) {
  //...SOME PREPARE FUNCTION STUFF GOES HERE...
  //Add the Flight Information to the jsonFlight root JSON Object
  jsonFlight.Add("Flight Number", flightnum);
  jsonFlight.Add("Origin", originicao);
  jsonFlight.Add("Destination", desticao);
  jsonFlight.Add("Pilot in Command", pic);
  //Write the jsonFlight object to a .json file on disk. Filename is passed in as a param    of the function.
  Jzon::FileWriter::WriteFile(jsonfilename, jsonFlight, Jzon::NoFormat);
  return 0;
}
int UpdateJSON_FlightPath(ACFT_PARAM* pS, const char* jsonfilename) {
  //Add the current returned coordinates to the jsonCoordinates jzon object
  jsonCoordinates.Add("altitude", pS-> altitude);
  jsonCoordinates.Add("latitude", pS-> latitude);
  jsonCoordinates.Add("longitude", pS-> longitude);
  //Add the Coordinates to the FlightPath then clear the coordinates.
  jsonFlightPath.Add(jsonCoordinates);
  jsonCoordinates.Clear();
  //Now add the entire flightpath array to the jsonFlight object.
  jsonFlight.Add("Flightpath", jsonFlightPath);
  //write the jsonFlight object to a JSON file on disk.
  Jzon::FileWriter::WriteFile(jsonfilename, jsonFlight, Jzon::NoFormat);
  //Remove the entire jsonFlighPath array from the jsonFlight object to avoid duplicaiton next time the function executes.
  jsonFlight.Remove("Flightpath");
  return 0;
}
4

1 に答える 1

0

確かに「フラットファイル」ストレージを自分で作成できます..しかし、これはデータベースが必要な兆候です。SQLite のような非常に軽いもの、または MySQL、FireBird、または PostgreSQL のような中規模でオープンソースのもの。

しかし、あなたの質問に関して:

1) 閉じ括弧 ] をオフのままにし、ファイルを開いて追加したままにします。ただし、ファイルを正しく閉じないと、ファイルが破損し、読み取り可能にするには修復が必要になります。

2) 現在のオプション - 毎回完全なファイルを書き込む - は、「開いて上書きする」瞬間に、以前にファイルに保存されたすべてのデータを失うため、データの損失から安全ではありません。ここでの回避策は、書き込みを開始する前に、バックアップとして古いファイルの名前を変更することです。

また、最初のオプションを使用して、ファイルのバックアップ コピーを作成する必要があります。(毎日の間隔で言ってください)。そうしないと、Ctrl-C、電源喪失、プログラムエラー、またはシステムクラッシュなど、最終的にデータ損失が発生する可能性があります。

もちろん、SQLlite、MySQL、Firebird、または PostgreSQL のいずれかを使用すると、すべてのデータ整合性の問題が処理されます。

于 2013-08-02T05:10:02.357 に答える