Home > database >  Cant read beyond end of stream
Cant read beyond end of stream

Time:10-19

Here I register new sellers:

private void btn_läggtill_Click(object sender, EventArgs e)
{
    string namn = txtn.Text;
    double personnr;
    if (!double.TryParse(txtp.Text, out personnr))
    {
        MessageBox.Show("personnummer måste vara ett tal"); 
        return;
    }
    
    string distrikt = txtd.Text;
    
    int antal = 0;
    if (!int.TryParse(txta.Text, out antal))
    {
        MessageBox.Show("Antal måste vara ett tal"); 
        return;
    }
    
    int nivå = 0;
    if (antal < 50) 
    {
        nivå = 1;
    }
    else if (antal >= 50 && antal <= 99) 
    {
        nivå = 2;
    }
    else if (antal >= 100 && antal <= 199) 
    {
        nivå = 3;
    }
    else 
    { 
        nivå = 4; 
    }
    
    Säljare nySäljare = new Säljare(namn, personnr, distrikt, antal, nivå);
    säljare.Add(nySäljare);
    säljare = säljare.OrderBy(x => x.Nivå).ToList();
    dgvViewsäljare.DataSource = säljare;
}

Here I save list of users into external file

private void btn_spara_Click(object sender, EventArgs e)
{
    DialogResult resultat = dlgSparaSom.ShowDialog();
    
    if (resultat == DialogResult.OK)
    {
        FileStream utStröm = new FileStream(dlgSparaSom.FileName, FileMode.OpenOrCreate, FileAccess.Write);
        BinaryWriter skrivare = new BinaryWriter(utStröm);
    
        int antalsäljare = säljare.Count;
        skrivare.Write(antalsäljare);
    
        for (int i = 0; i < säljare.Count; i  )
        {
            skrivare.Write(säljare[i].Namn);
            skrivare.Write(säljare[i].Personnr);
            skrivare.Write(säljare[i].Distrikt);
            skrivare.Write(säljare[i].Antal);
            skrivare.Write(säljare[i].Nivå);
        }
        skrivare.Dispose();
    }
}

Here is where the problem is, I can't open the file again:

private void btn_öppna_Click(object sender, EventArgs e)
{
    DialogResult resultat = dlgÖppnaFil.ShowDialog();
    
    if (resultat == DialogResult.OK)
    {
        FileStream inStröm = new FileStream(dlgÖppnaFil.FileName, FileMode.Open, FileAccess.Read);
        BinaryReader läsare = new BinaryReader(inStröm);
    
        int antalsäljare = läsare.ReadInt32();
    
        for (int i = 0; i < antalsäljare; i  )
        {
            string namn = läsare.ReadString();
            double personnr = läsare.ReadSingle();
            string distrikt = läsare.ReadString();
            int antal = (int)läsare.ReadSingle();
            int nivå = (int)läsare.ReadSingle();

            Säljare nysäljare = new Säljare(namn, personnr, distrikt, antal, nivå);
            säljare.Add(nysäljare);
    
            dgvViewsäljare.Rows.Clear();
    
            var col1 = new DataGridViewTextBoxColumn();
            var col2 = new DataGridViewCheckBoxColumn();
            var col3 = new DataGridViewTextBoxColumn();
            var col4 = new DataGridViewCheckBoxColumn();
            var col5 = new DataGridViewTextBoxColumn();
    
            col1.HeaderText = "Namn";
            col1.Name = "Column3";
    
            col2.HeaderText = "Personnummer";
            col2.Name = "Column4";
    
            col3.HeaderText = "Distrikt";
            col3.Name = "Column3";
    
            col4.HeaderText = "Antal";
            col4.Name = "Column3";
    
            col5.HeaderText = "Nivå";
            col5.Name = "Column3";
    
            dgvViewsäljare.Columns.AddRange(new DataGridViewColumn[] { col1, col2, col3, col4, col5 });
    
            dgvViewsäljare.Rows.Add(namn, personnr, distrikt, antal, nivå);
            dgvViewsäljare.Rows[dgvViewsäljare.Rows.Count - 1].Tag = nysäljare;
        }
        läsare.Dispose();
    }
}

When I click "open file" (btn_öppna_Click) I get:

Unable to read beyond the end of the stream.

@ string distrikt = läsare.ReadString();

Would highly appreciate responses and of course I'm here to edit if needed.

CodePudding user response:

This should probably do the trick:

string namn = läsare.ReadString();
double personnr = läsare.ReadDouble();
string distrikt = läsare.ReadString();
int antal = (int)läsare.ReadInt32();
int nivå = (int)läsare.ReadInt32();

The types need to be exactly the same.

CodePudding user response:

Try wrapping your streams around using(){} so that they dispose in order, and try closing your stream after accessing your file.

//Example:
 using(FileStream utStröm = new FileStream(dlgSparaSom.FileName, FileMode.OpenOrCreate, FileAccess.Write)){
            using(BinaryWriter skrivare = new BinaryWriter(utStröm)){
              //Rest of the code here without skrivare.Dispose();
             }
            utStröm.Close();
}
  •  Tags:  
  • c#
  • Related