Вставка числа на случайную позицию в двоичный файл

Всем привет! В общем, необходимо на случайно заданную позицию, получившегося файла в мейне, вставить пользователем заданное число. Не получается это сделать, буду рад любой помощи, хотя бы какой-то статейке про двоичные файлы. Код по сути не рабочий(в мейне все работаетб остальное работает криво), но вдруг, по нему все-таки можно будет что-то подсказать. Заранее всем спасибо за ответы)


static void bRemove(string path, byte n, string ReadStr)
        {
            string FileRead = "";
            bool flag = true;
            Random rnd = new Random();
            BinaryWriter Writer = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate));
            Writer.BaseStream.Position = rnd.Next(0, ReadStr.Length);
            //Writer.Seek(rnd.Next(0, ReadStr.Length), SeekOrigin.Begin);
            while (flag)
            {
                if ((Writer.BaseStream.Position.Equals(' ')) || (Writer.BaseStream.Position.Equals(',')))
                {
                    Writer.BaseStream.Position = rnd.Next(0, ReadStr.Length);
                }
                else
                {
                    Writer.Write(n);
                    flag = false;
                   
                }
            }
            Writer.Close();
            BinaryReader bRead = new BinaryReader(File.Open(path, FileMode.Open));
            while (bRead.PeekChar() > -1)
            {
                FileRead = bRead.ReadString();
            }
            bRead.Close();
            var result = FileRead.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < result.Length; i++)
            {
                Console.WriteLine(result[i]);
            }
            Console.WriteLine(FileRead);
        }

        static void Main()
        {
            double sum = 0, n;
            byte UserNum;
            string ReadStr = "";
            string path = @"D:\New.dat";
            BinaryWriter bWrite = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate));
            bWrite.Write("2, 3, 0, 2, 5, 7");
            bWrite.Close();
            BinaryReader bRead = new BinaryReader(File.Open(path, FileMode.Open));
            while (bRead.PeekChar() > -1)
            {
                ReadStr = bRead.ReadString();
            }
            bRead.Close();
            Console.WriteLine(ReadStr);
            var result = ReadStr.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < result.Length; i++)
            {
                n = double.Parse(result[i]);
                sum += Math.Pow(n, 2);
            }
            Console.WriteLine($"\n {sum}");
            Console.Write("Введите число: ");
            UserNum = byte.Parse(Console.ReadLine());
            bRemove(path, UserNum, ReadStr);

        }


Ответы (1 шт):

Автор решения: Alexander Petrov

Пример с использованием FileStream.
Сперва я создаю файл и заполняю его десятью байтами.
Потом вывожу его содержимое.
Затем на случайную позицию вставляется новое значение.
После чего снова выводим содержимое файла, чтобы убедиться в изменениях.

// Создаём файл и заполняем числами
using (var fileStream = new FileStream("test.bin", FileMode.Create))
{
    for (byte b = 0; b < 10; b++)
        fileStream.WriteByte(b);
}

// Смотрим содержимое файла
using (var fileStream = new FileStream("test.bin", FileMode.Open))
{
    var bytes = new byte[fileStream.Length];
    fileStream.Read(bytes, 0, bytes.Length);
    Console.WriteLine(string.Join(",", bytes));
}

// Изменяем содержимое файла
var random = new Random();
byte number = 255; // число, полученное от пользователя

using (var fileStream = new FileStream("test.bin", FileMode.Open))
{
    // Генерируем случайную позицию
    int offset = random.Next(0, (int)fileStream.Length);

    // Устанавливаем указатель потока на эту позицию
    fileStream.Seek(offset, SeekOrigin.Begin);

    // Пишем в эту позицию число
    fileStream.WriteByte(number);
}

// Смотрим содержимое файла
using (var fileStream = new FileStream("test.bin", FileMode.Open))
{
    var bytes = new byte[fileStream.Length];
    fileStream.Read(bytes, 0, bytes.Length);
    Console.WriteLine(string.Join(",", bytes));
}

Вывод:

0,1,2,3,4,5,6,7,8,9
0,1,2,3,4,5,6,255,8,9

Число 255 будет на случайной позиции.

Код с применением BinaryWriter будет почти такой же.

→ Ссылка