これは私の最初の投稿ですので、ご容赦ください。
答えを求めてインターネットで高低を検索しましたが、問題を解決できなかったため、ここに投稿することにしました。
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;
}