Product
次のようなメンバー変数を持つclass のオブジェクトがあるとしますprice, name, etc.
。そして、そのような Product オブジェクトが 10 個あるとします。ここで、10個すべてをいくつかのファイルに書きたいと思いますProducts.dat
。後で、ファイルから 6 番目の製品を取得すると言いたいと思います。通常、C ++でどのように達成されますか? (私は単に部分を取得することに興味があります)。
3 に答える
データ セットを取得する方法は、データの保存方法によって異なります。固定サイズの構造がある場合は、 を使用fseek(file, dataSize * RecordNr, SEEK_SET);
してファイルを目的のオフセットに配置し、そこからデータを読み取ることができます。これには、たとえば、文字列name
の最大長が固定されていて、レコードが常にその既知の長さで保存されている必要があります。
データ構造が可変長の場合、各レコードの長さを計算するか、個別に読み取る必要があります。この場合、sqlite や XML などの既存のライブラリを使用してファイルの内容を管理することをお勧めします。
可変長構造の別の方法は、各レコードのオフセットを格納するインデックスとして 2 番目のファイルを維持することです。
割り当てのためにこの少数のレコードのみが必要な場合は、固定長レコードで fseek を使用するだけでおそらく十分です。
アップデート
固定サイズのレコードを使用するには、ポインターを使用せずにデータ構造を作成する必要があります。そうしないと、それらのメンバーを個別に読み書きする必要があります。
例:
class Product
{
double Price;
int Category;
char Name[50];
char ArticleId[10];
};
それ以外の
class Product
{
double Price;
int Category;
char *Name;
char *ArticleId;
};
ただし、このように構造が固定されているため、プログラムは作成したプラットフォームでのみ動作することに注意してください。データ ファイルを他のプラットフォームに簡単にコピーすることはできません。他のプラットフォームとの互換性を持たせたい場合は、移植が非常に難しくなるため、このアプローチを使用しないでください。
タスクに真剣に取り組み、パフォーマンス、移植性、バイナリ互換性に関心がある場合は、 MongoDBやProtocol Buffersなどの NoSQL データベースを他の NoSQL データベースと一緒に使用することを検討してください。
別のプロセスで実行されているデータベースへの接続を開きます。
mongo::DBClientConnection c;
c.connect("localhost");
データベースのクエリは次のようになります。
std::unique_ptr<DBClientCursor> cursor =
c.query("mystore.products", BSONObj());
while (cursor->more()) {
BSONObj p = cursor->next();
std::cout << p.getStringField("name") << std::endl;
「C++ ドライバー入門」の行に沿って
オブジェクトをデータベースに挿入します。
BSONObj p = BSON( "name" << "A nice book" << "price" << 42 );
c.insert("mystore.products", p);
更新、詳細: シリアライゼーションだけが必要で、効率的なクエリやトランザクションなどが必要ない場合は、「単に」適切なシリアライゼーション戦略が必要です: JSON、BSON、Protocol Buffers、MessagePackまたはXML、Boost.Serializationまたはcpgfが役立つ場合があります