Как вытащить две переменные из бинарного файла?

У меня есть бинарный файл в который я записал две переменные(string и int). Мне нужно вытащить их оттуда и записать в класс. Я написал часть кода но он не работает правильно.
Вот мой код:
static Product ReadProduct(string fname)
        {
            Product product = new Product(" ", 0);

            using (FileStream f = new FileStream(fname, FileMode.Open))
            {
                byte[] strBytes = new byte[sizeof(char)];
                f.Read(strBytes, 0, strBytes.Length);
                for (int i = 0; i < f.Length; i++)
                {
                    f.Read(strBytes, 0, strBytes.Length);
                    string str = Encoding.Default.GetString(strBytes);

                    if (str != " ")
                    {
                        product.Name += str;
                    }
                    else
                        break;
                }
                byte[] priceBytes = new byte[sizeof(int)];
                f.Read(strBytes, 0, strBytes.Length);
                product.Price = BitConverter.ToInt32(priceBytes, 0);

            }
            return product;
        }


Мой код считывает файл и записывает его, но на выводе я вижу неправильные символы. Буду рад любой помощи.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
cjstress
@cjstress
C#
Ну такой код конечно cтранно выглядит.
Он скорее всего еще и с ошибкой.

Почему бы не читать файл одной строкой?
string text = await File.ReadAllTextAsync(filePath);

А информацию о продукте хранить в нужно формате объекта, например JSON
Ответ написан
Комментировать
Вообще, имхо, достаточно странная у вас идея, придумывать какой-то свой формат для данных.
Почему не json, не protobuf, не msgpack, ни хоть тот же BinarySerializer?

1.
Мой код считывает файл и записывает его, но на выводе я вижу неправильные символы

Значит либо читает, либо пишет неправильно.
2.
f.Read(strBytes, 0, strBytes.Length); //Зачем тут эта строка, если дальше в цикле идёт чтение?
                //Длина стрима считается в байтах, а char имеет размер 2, а не 1
                for (int i = 0; i < f.Length; i++)
                {
                    // А кто будет проверять, сколько по факту прочитано байтов и дочитывать непрочитанное?
                    f.Read(strBytes, 0, strBytes.Length);
                   // А кем гарантирована кодировка?
                  //Иногда Encoding.Default может кинуть NotSupportedException, так что лучше использовать конкретную кодировку
                    string str = Encoding.Default.GetString(strBytes);

                    if (str != " ") // А кто гарантирует, что в середине вашей строки не будет пробелов?
                    {
                        product.Name += str; //Лучше использовать StringBuilder
                    }
                    else
                        break;
                }

3. Как-то странно происходит чтение цены (смотри имена переменных)
byte[] priceBytes = new byte[sizeof(int)];
                f.Read(strBytes, 0, strBytes.Length);
                product.Price = BitConverter.ToInt32(priceBytes, 0);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы