0

1つのアプリケーションからプロシージャコール(ネットワークプロトコルなし、同じマシンで実行されている2つのアプリケーションのみ)でオーディオデータパッケージを受信し、それを構造体に入れ、マップされたファイルに書き込むデータバッファを実装しています。

そのため、ライター アプリケーションはアプリのプロシージャを呼び出すことができます。これはvoid writeData (DataItem data, Timestamp ts)、各データ項目のサイズが 2MB で、1 秒間に約 15 回のようになります。

私のアプリは、データを次のような構造体に保存します

Struct DataItem 
{
long id;
...  Data; 
Time  insertTime;
}

将来の読み取り用にファイルに書き込みます。

構造体をそのままファイルに保存するのは難しいので、バイナリで書く必要があると思います(?)。ですから、どのような種類のシリアライゼーションも使用する必要があるかどうかわかりboost serializationませんか?

また、メモリマップファイル用にこのデータを整列する方法と、ファイルからの読み取り目的でデータを再構築する方法もわかりません。

インターネットを検索しましたが、コード例があまり見つかりませんでした。また、サンプル コードは非常に高く評価されます。

ちなみに、Windows 7 x64 embedded と Visual Studio 2008 を使用しています。

ありがとう...

4

3 に答える 3

2

C++ でシリアル化する一般的な方法は次のとおりです。

struct myStruct
{
    int         IntData;
    float       FloatData;
    std::string StringData;
};

std::ostream& operator<<(std::ostream &os, const myStruct &myThing)

{
    os
    << myThing.IntData      << " "
    << myThing.FloatData    << " "
    << myThing.StringData   << " "
    ;
    return os;
}

std::istream& operator>>(std::istream &is, myStruct &myThing)
{
    is 
    >> myThing.IntData
    >> myThing.FloatData
    >> myThing.StringData;

    return is;
}


void WriteThing()
{
    myStruct myThing;

    myThing.IntData = 42;
    myThing.FloatData = 0.123;
    myThing.StringData = "My_String_Test";

    std::ofstream outFile;
    outFile.open("myFile.txt");

    outFile << myThing;
}

void ReadThing()
{
    myStruct myThing;

    std::ifstream inFile;
    inFile.open("myFile.txt");    
    inFile >> myThing;
}

ご注意ください:

  • std::string は演算子 << および >> を定義します。それらは上記のコードで呼び出されます。
  • ストリームは空白文字を区切り文字として扱います。空白を含む文字列を格納するには、追加の処理が必要になります
  • ソフトウェアの更新を通じてデータを保持する予定がある場合は、何らかのファイルのバージョン管理を実装する必要があります
  • 単一の大きなファイルでシークなどを使用してファイル ポインタを移動する方法については、fstreamのドキュメントを参照してください。
于 2014-01-27T13:42:38.640 に答える
0

テキスト アーカイブでboost::serializationを使用します。
プラットフォームの独立性を解決する最も「標準的な」方法です。
オプションで、その上に gzip 圧縮を設定できます。

于 2014-01-27T15:40:32.920 に答える
-1

C# ではなく C++ について尋ねているのですか? あなたのコード例はC#のように見えます

C++ の場合 構造体の形式が変更されない場合は、配列をディスクに書き出すことができます。

これはあなたが要求した例ですが、これは実際には C 101 のものです

FILE* output=fopen ("myfile", "wb");
fwrite (array, sizeof (mystruct), number_of_elements_in_array, output);
fclose (output);
于 2014-01-27T08:33:23.617 に答える