Tengo un archivo plano generado por un programa C. Cada registro en el archivo consiste en un encabezado de longitud fija seguido de datos. El encabezado contiene un campo que indica el tamaño de los siguientes datos. Mi objetivo final es escribir un programa C#/.NET para consultar este archivo plano, así que estoy buscando la manera más eficiente de leer el archivo usando C#.¿Manera preferida de analizar un archivo plano binario personalizado?
Tengo problemas para encontrar el .NET equivalente de la línea 7 en el siguiente código. Por lo que puedo decir, tengo que emitir múltiples lecturas (una para cada campo del encabezado usando BinaryReader) y luego emitir una lectura para obtener los datos que siguen al encabezado. Estoy intentando aprender una forma de analizar un registro en dos operaciones de lectura (una lectura para obtener el encabezado de longitud fija y una segunda lectura para obtener los siguientes datos).
Este es el código C que estoy tratando de duplicar el uso de 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);
}
Esta es la estructura C de la cabecera:
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;
};
se me ha ocurrido con este C# objeto para representar el encabezado 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;
}
¿Cómo se ve tu encabezado? –
posible duplicado de [AC# equivalente del archivo de fread de E/o de C] (http://stackoverflow.com/questions/1935851/ac-equivalent-of-cs-fread-file-io) –
He editado la publicación para contener la estructura del encabezado. –