Исключение конца потока при попытке добавить элементы списка <> в список1 из двоичного файла

Мой проект сохраняет телефонные номера в списке<> и сохраняет их в файл.bin:

private void savebutton_Click(object sender, EventArgs e)
    {
        SaveFileDialog sv = new SaveFileDialog();
        sv.Filter = "Binary files (*.bin)|*.bin|All files(*.*)|*.*";
        sv.Title = "Save File";
        sv.FilterIndex = 2;
        sv.RestoreDirectory = true;
        sv.InitialDirectory = Path.GetFullPath(@"F:\Computer Technology Skills\Programming 35\Module 1\ICA10\ICA10\bin\Debug");
        if (sv.ShowDialog() == DialogResult.OK)
        {
            try
            {
                FileStream fs = new FileStream(sv.FileName, FileMode.Create, FileAccess.Write);
                BinaryWriter file = new BinaryWriter(fs);
                //         System.IO.StreamWriter file = new System.IO.StreamWriter(sv.FileName.ToString());
                var message = string.Join(Environment.NewLine, PhoneNum);
                file.Write(message);
                file.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); 
            }

        }
    }

Затем при нажатии кнопки загрузки предполагается удалить элементы, находящиеся в данный момент в списке1, чтобы заменить их теми элементами, которые были в файле bin в каждой строке.

private void loadbutton_Click(object sender, EventArgs e)
    {
        OpenFileDialog od = new OpenFileDialog();
        string databyte = null;
        long iNumInts = 0;

        od.RestoreDirectory = true;
        od.InitialDirectory = Path.GetFullPath(@"F:\Computer Technology Skills\Programming 35\Module 1\ICA10\ICA10\bin\Debug");
        if (od.ShowDialog() == DialogResult.OK)
        {
            try
            {
                FileStream fs = new FileStream(od.FileName, FileMode.Open);
                listBox1.Items.Clear();
                using (BinaryReader reader = new BinaryReader(fs))
                {

                    iNumInts = fs.Length / sizeof(int);
                    for (int i = 0; i < iNumInts; i++)
                    {
                        databyte = reader.ReadString(); //Endofstreamexception
                        listBox1.Items.Add(databyte);

                    }
                        fs.Close();
                        reader.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

Проблема в том, что когда я загружаю сохраненный файл, все элементы застревают в первом индексе listbox1, и я получаю исключение endofstream.

Я немного сбит с толку, поскольку мои заметки мало помогли, а другие вопросы о переполнении стека, которые я нашел, были примерами с использованием целых чисел или массивов. Я переключился с потокового редактора на двоичный, что очень помогло, но любая помощь будет высоко ценится!

2 ответа

Решение

Я бы порекомендовал использовать StreamReader за это.

using (StreamReader reader = new StreamReader(od.Filename))
{
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        listbox1.Items.Add(line);
    }
}

Вы также можете использовать File.ReadLines, который сделает все за вас (если вы используете.NET 4 или выше).

Глядя на ваш код сохранения, похоже, что вы пишете телефонные номера в виде одной строки с разделителем новой строки между ними. В коде чтения вы пытаетесь прочитать их как отдельные строки с помощью метода ReadString.

Одна строка равна одной строке. Другими словами, если вы записываете их все как одну строку, то читаете их все как одну строку. Тогда вы можете использовать string.split и получить индивидуальные номера.

Другие вопросы по тегам