プロが教える店舗&オフィスのセキュリティ対策術

特定のデータをファイルにどんどん出力し、その後、そのファイルから所望のデータ(X番目のデータ)
を取得するということをC#で行いたいと考えています。

Cでは、データをバイナリ出力し、所望のデータを取得するには必要な分シークしてそこから読み出せばよいと思うのですが(下記参照)、C#で同様のことをするにはどうしたらよいでしょうか。

調べてみると、シリアライズでは、ファイルからデータを読み出す際に、X番目のデータの位置までシークして所望のデータを読み出すということができないようですし(シリアライズは、ファイルサイズも大きくなり、遅くなる?)。

上記のようなことを実現したい場合、通常、C#ではどのように行うのでしょうか。

-------
typedef struct HEADER_ {
int iID;
short sDate[8];
} HEADER;

typedef struct DATA_ {
int a[8];
double b[8];
} DATA;

class Sample {
public:
//新規
void Create(int iID)
{
HEADER h;
h.iID = iID;
//ヘッダー書き出し
FILE* fp = fopen("Sample.BIN", "ab");
fwrite(&h, 1, sizeof(HEADER), fp);
fclose(fp);
}

//書き込み
void WriteData(DATA* pData)
{
FILE* fp = fopen("Sample.BIN", "ab");
fwrite(pData, 1, sizeof(DATA), fp);
fclose(fp);
}

//読み出し
void ReadData(DATA* pData, int index)
{
FILE* fp = fopen("Sample.BIN", "rb");
fseek(fp, sizeof(HEADER) + sizeof(DATA) * (index - 1), SEEK_SET);
fread(pData, sizeof(DATA), 1, fp);
fclose(fp);
}

};

int main(int argc, _TCHAR* argv[])
{
Sample* pSample = new Sample();

//データの書き出し
// ヘッダー出力
pSample->Create(100);
// データ出力
for(int i = 0; i < 100; i++){
//ダミーデータ作成
DATA din;
din.a[0] = i;
din.b[7] = i * 0.1;
//データ出力
pSample->WriteData(&din);
}

//X番目のデータの読み出し
DATA dout;
pSample->ReadData(&dout, 50);

return 0;
}

A 回答 (2件)

>>上記のようなことを実現したい場合、通常、C#ではどのように行うのでしょうか。



C#に限りませんけど、最近のPHPやJava、Rubyによる開発は、その言語でデータアクセスルーチンをコーディングしません。
データ処理には、誰かが開発してくれたフレームワークやデータベースを使うのが普通になっています。

それらを使うことで、開発期間、工数が減ると同時に、バグも減りますからね。

そして、C#の場合はEntity frameworkというものが広く使われています。
それを使うことによって、

「X番目のデータの読み出し」だけじゃあなく、「名前の一部に'山'が含まれている人のデータ」を全て取り出すとか、「それで取り出したデータを○項目目と×項目目で並べ替える」

なんて処理が、1行のコードで可能になったりしますからね。
    • good
    • 1
この回答へのお礼

ありがとうございます。Entity frameworkというものを試してみたいと思います。

お礼日時:2016/12/10 07:39

下記URLにC#で、バイナリーファイルの読み書きを行う方法が記載されています。


http://www.atmarkit.co.jp/fdotnet/dotnettips/669 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2016/12/10 07:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!