我有一个由 C 程序生成的平面文件。文件中的每条记录都包含一个固定长度的标头,后跟数据。标头包含一个指示后续数据大小的字段。我的最终目标是编写一个 C#/.NET 程序来查询这个平面文件,所以我正在寻找使用 C# 读取文件的最有效方法。
我无法在以下代码中找到第 7 行的 .NET 等效项。据我所知,我必须发出多次读取(使用 BinaryReader 为标题的每个字段一个),然后发出一次读取以获取标题后面的数据。我正在尝试学习一种在两次读取操作中解析记录的方法(一次读取以获取固定长度的标头,第二次读取以获取以下数据)。
这是我尝试使用 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;
}