Сохранение трех массивов в один файл с последующим разделением файла на три массива - PullRequest
0 голосов
/ 24 сентября 2019

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

Сохранение информации:

private void BtngameSave_Click(object sender, EventArgs e)
        {
            string FileName = "mygames.dat";
            SaveFileDialog SaveBinary = new SaveFileDialog();
            DialogResult sr = SaveBinary.ShowDialog();
            if (sr == DialogResult.OK)
            {
                FileName = SaveBinary.FileName;
            }
            try
            {
                using (Stream stream = File.Open(FileName, FileMode.Create))
                {
                    BinaryFormatter bin = new BinaryFormatter();
                    for (int i = 0; i < ptr; i++)
                    {
                        save[i] = gameQueueTitle[i] +"*"+ gameQueueGenre[i] +"*"+ gameQueuePlat[i];
                        bin.Serialize(stream, save[i]);
                    }
                    MessageBox.Show("File saved");
                }
            }
            catch (IOException)
            {
                MessageBox.Show("The Save Binary Stream did not work");
            }
        }

Открытие сохраненного файла:

private void BtngameOpen_Click(object sender, EventArgs e)
        {
            string FileName = "mygames.dat";
            OpenFileDialog OpenBinary = new OpenFileDialog();
            DialogResult sr = OpenBinary.ShowDialog();
            if (sr == DialogResult.OK)
            {
                FileName = OpenBinary.FileName;
            }
            ptr = 0;
            try
            {
                using (Stream stream = File.Open(FileName, FileMode.Open))
                {
                    BinaryFormatter bin = new BinaryFormatter();
                    while (stream.Position < stream.Length)
                    {
                        string rec = bin.Deserialize(stream).ToString();
                        gameQueueTitle[ptr] = rec;
                        ptr++;
                    }
                    SortList();
                    DisList();
                }
            }
            catch (IOException)
            {
                MessageBox.Show("Couldn't open the binary file");
            }
}

1 Ответ

0 голосов
/ 24 сентября 2019
  1. Я рекомендую определить класс, который будет содержать gameQueueTitle, gameQueueGenre, gameQueuePlat: это устранит необходимость в 3 отдельных списках, и вам не нужно бояться несоответствия, так как в одном списке отсутствует элемент, потому чтоошибки или что-то вроде этого.Вам также больше не нужен ptr, потому что в списке есть свойство count:
    public class GameInfo
    {
        public string Title
        {
            get;
            set;
        }

        public string Genre
        {
            get;
            set;
        }

        public string Plat
        {
            get;
            set;
        }
    }
Чтобы ответить на ваши вопросы, я быстро переписал ваши функции (если я правильно понял, что ваш вопрос правильно, ваш код не работает):

Сохранение информации:

private void BtngameSave_Click(object sender, EventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.FileName = "mygames.dat";

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    using (FileStream fs = new FileStream(dialog.FileName, FileMode.OpenOrCreate))
                    {
                        using (StreamWriter writer = new StreamWriter(fs))
                        {
                            for(int i = 0; i < ptr; ++i)
                            {
                                writer.WriteLine(gameQueueTitle[i] + "*" + gameQueueGenre[i] + "*" + gameQueuePlat[i]);
                            }
                        }

                        fs.Close();
                    }

                    MessageBox.Show("File saved");
                }
                catch
                {
                    MessageBox.Show("Couldn't save the binary file");
                }
            }
        }

Открытиесохраненный файл:

        private void BtngameOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            if (dialog.ShowDialog() == DialogResult.OK)
            { 
                try
                {
                    using (FileStream fs = new FileStream(dialog.FileName, FileMode.OpenOrCreate))
                    {
                        using (StreamReader reader = new StreamReader(fs))
                        {
                            ptr = 0;

                            for (ptr = 0; !reader.EndOfStream; ++ptr)
                            {
                                string line = reader.ReadLine();

                                string[] values = line.Split('*');

                                gameQueueTitle[ptr] = values[0];
                                gameQueueGenre[ptr] = values[1];
                                gameQueuePlat[ptr] = values[2];
                            }
                        }

                        fs.Close();
                    }

                    MessageBox.Show("File processed");
                }
                catch
                {
                    MessageBox.Show("Couldn't open the binary file");
                }
            }
        }
Сохраняйте или открывайте файл только в том случае, если результат диалога в порядке.Ваш код сохраняет / читает файл, даже если пользователь отменяет диалог.Никто из пользователей не ожидает такого поведения.
...