Программа после записи в двоичный файл реестра, содержащего:
StringBuilder name0 = new StringBuilder(15);
int stock0, safe0;
double cost0;
должен прочитать данные одного реестра, указав идентификатор на основе позиции реестра.
Так как реестр составляет 20 байтов, позиция каждого реестра будет:
pos = (id-1) * 20;
право
Проблема в том, что StringBuilder
не содержит ровно 15 символов, но длина имени, которое вы пишете каждый раз, и вместо чтения нужных вам данных, вы читаете мусор. Разве нет способа объявить строку, которая всегда будет иметь точный размер, чтобы правильно читать данные?
Код:
public static void Main(string[] args)
{
Console.WriteLine("Give file name: ");
string f = Console.ReadLine();
StringBuilder name0 = new StringBuilder(15);
bool criterion = true;
int stock0, safe0;
double cost0;
long id, pos;
try
{
FileStream fs = File.Open(f, FileMode.Create, FileAccess.ReadWrite);
BinaryWriter writer = new BinaryWriter(fs);
BinaryReader reader = new BinaryReader(fs);
while (criterion != false)
{
Console.WriteLine("Give name (10 char) or STOP for end");
name0.Insert(0, Console.ReadLine());
if ((name0.ToString()).Equals("STOP"))
criterion = false;
else
{
Console.WriteLine("Stock : ");
stock0 = Int32.Parse(Console.ReadLine());
Console.WriteLine("Safe: ");
safe0 = Int32.Parse(Console.ReadLine());
Console.WriteLine("Cost: ");
cost0 = double.Parse(Console.ReadLine());
writer.Write(name0.ToString());
writer.Write(stock0);
writer.Write(safe0);
writer.Write(cost0);
} // else
name0.Remove(0, name0.Length);
} //while
Console.WriteLine(" Give ID: ");
id = long.Parse(Console.ReadLine());
pos = (id - 1) * 20; //20 = megethos eggrafis(2 int+ 1db + 16chars)
if ((pos < fs.Length) && (id != 0))
{
fs.Seek(pos, SeekOrigin.Begin);
name0.Insert(0, reader.ReadChars(name0.Length));
Console.WriteLine("Name: {0}", name0);
stock0 = reader.ReadInt32();
Console.WriteLine("\nStock: {0}", stock0);
safe0 = reader.ReadInt32();
Console.WriteLine("\nSafe: {0}", safe0);
cost0 = reader.ReadDouble();
Console.WriteLine("\nCost: {0}", cost0);
name0.Length = 0;
}
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}