我创建了多个二进制文件,每个文件包含2个字符串,2个字符,1个double和1个int。读取时的数据是
Fokker DR 1
Germany
D
A
1000.0
13
我正在尝试将dat文件解析为数组,因此我可以使用适当的名称标记每种数据类型,例如
Name: Fokker DR 1
Country: Germany
Attack Mode: D
Turn Mode: A
etc.
但是我遇到了麻烦,因为当尝试使用StreamReader并在空白的每个实例上拆分二进制文件时,由于名称(Fokker DR 1)包含多个不应该是空格的事实,我遇到了问题分裂。
以下是我尝试拆分的代码:
if (file.Contains("plane1"))
{
StreamReader reader = new StreamReader("plane1.dat");
string line;
while ((line = reader.ReadLine()) != null)
{
string[] data = line.Split(' ');
bin.ReadBinary("plane1.dat");
Console.WriteLine("Name: " + data[0]);
Console.WriteLine("Country: " + data[1]);
Console.WriteLine("Turn Mode: " + data[2]);
Console.WriteLine("Attack Mode: " + data[3]);
Console.WriteLine("Cost: " + data[4]);
Console.WriteLine("Max Damage: " + data[5]);
}
}
是否有任何方法可以在不同数据类型的每个实例中进行拆分,还是有另一种方法来标记二进制文件中的数据?
答案 0 :(得分:2)
BinaryFormatter
无法处理该文件格式。鉴于小尺寸和直接规格,一些ustom读取逻辑应该可以解决问题。
如果您使用BinaryReader
打开文件,您可以自行决定如何处理您要阅读的下一个字节或字节。如果文件的格式不复杂,这很容易实现。根据您的规范,我创建了此代码来读取您的文件:
using(var br = new BinaryReader(
File.Open(@"c:\tmp\plane.dat", FileMode.Open),
Encoding.ASCII))
{
while(br.BaseStream.Position < br.BaseStream.Length)
{
var name = br.ReadString();
var country = br.ReadString();
var turnmode = br.ReadChar();
var attackmode = br.ReadChar();
var cost = br.ReadDouble();
var maxdamage = br.ReadInt32();
// you can use above vars what ever you need to do
// with them, writing to the console or adding to
// a list for example
// Planes.Add(new Plane {Name = name});
}
}
在我的测试中,我创建的文件与您的二进制格式匹配。由于您没有显示下一条记录开始的位置,您可能会发现需要额外阅读,例如使用ReadByte
,但这取决于您的实际结构。