У меня есть плоский файл, созданный программой на Си.Каждая запись в файле состоит из заголовка фиксированной длины, за которым следуют данные.Заголовок содержит поле, указывающее размер следующих данных.Моя конечная цель - написать программу на C # / .NET для запроса этого плоского файла, поэтому я ищу наиболее эффективный способ чтения файла с использованием C #.
У меня проблемы с поиском .NET-эквивалента строки 7 в следующем коде.Насколько я могу судить, мне нужно выполнить несколько операций чтения (по одному для каждого поля заголовка с помощью BinaryReader), а затем выполнить одно чтение, чтобы получить данные, следующие за заголовком.Я пытаюсь научиться анализировать запись в двух операциях чтения (одна - для получения заголовка фиксированной длины, а вторая - для получения следующих данных).
Это код C, который я пытаюсьдля копирования с использованием C # /. NET:
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;
}