Cプログラムで生成されたフラットファイルがあります。ファイル内の各レコードは、固定長のヘッダーとそれに続くデータで構成されます。ヘッダーには、次のデータのサイズを示すフィールドが含まれています。私の最終的な目標は、このフラットファイルをクエリするC#/。NETプログラムを作成することです。そのため、C#を使用してファイルを読み取る最も効率的な方法を探しています。
次のコードで7行目に相当する.NETを見つけるのに問題があります。私の知る限り、複数の読み取り(BinaryReaderを使用してヘッダーの各フィールドに1つ)を発行してから、ヘッダーに続くデータを取得するために1つの読み取りを発行する必要があります。2つの読み取り操作(1つは固定長ヘッダーを取得するための読み取り、もう1つは次のデータを取得するための読み取り)でレコードを解析する方法を学習しようとしています。
これは、C#/。NETを使用して複製しようとしているCコードです。
struct header header; /* 1-byte aligned structure (48 bytes) */
char *data;
FILE* fp = fopen("flatfile", "r");
while (!feof(fp))
{
fread(&header, 48, 1, fp);
/* Read header.length number of bytes to get the data. */
data = (char*)malloc(header.length);
fread(data, header.length, 1, fp);
/* Do stuff... */
free(data);
}
これはヘッダーのC構造体です。
struct header
{
char id[2];
char toname[12];
char fromname[12];
char routeto[6];
char routefrom[6];
char flag1;
char flag2;
char flag3;
char flag4;
char cycl[4];
unsigned short len;
};
私はCヘッダーを表すためにこのC#オブジェクトを思いついた:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi, Size = 48)]
class RouterHeader
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
char[] Type;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
char[] To;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
char[] From;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
char[] RouteTo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
char[] RouteFrom;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
char[] Flags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
char[] Cycle;
UInt16 Length;
}