Laden...

Datei auslesen mit BinaryReader: EndOfStreamException

Erstellt von xKani vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.036 Views
Thema geschlossen
X
xKani Themenstarter:in
4 Beiträge seit 2012
vor 11 Jahren
Datei auslesen mit BinaryReader: EndOfStreamException

Hallo,

ich will eine Datei mit BinaryReader versuchen zu lesen. Ich habe mir schon die Strukutur der Datei angeschaut jedoch bekomme ich beim Debugging immer einen Error.
Hier erstmal mein Code zum Lesen der Datei

        private void ReadFile(string fileName)
        {
            this.Notices = new List<Form1.tNotice>();
            this.Menu = new List<string>();
            BinaryReader binaryReader = new BinaryReader(File.Open(fileName, FileMode.Open));
            binaryReader.ReadInt32();
            while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
            {
                int num = binaryReader.ReadInt32();
                int num1 = binaryReader.ReadInt32();
                byte[] numArray = binaryReader.ReadBytes(binaryReader.ReadInt32());
                byte[] numArray1 = binaryReader.ReadBytes(binaryReader.ReadInt32());
                byte[] numArray2 = binaryReader.ReadBytes(binaryReader.ReadInt32());
                byte[] numArray3 = binaryReader.ReadBytes(binaryReader.ReadInt32());
                byte[] numArray4 = binaryReader.ReadBytes(binaryReader.ReadInt32());
                Form1.tNotice _tNotice = new Form1.tNotice();
                _tNotice.ID = num;
                _tNotice.ID1 = num1;
                _tNotice.Name = this.Enc.GetString(numArray);
                _tNotice.Desc = this.Enc.GetString(numArray1);
                _tNotice.StartD = this.Enc.GetString(numArray2);
                _tNotice.EndD = this.Enc.GetString(numArray3);
                _tNotice.sUnkown = this.Enc.GetString(numArray4);
                this.Notices.Add(_tNotice);
                this.Menu.Add(string.Concat(_tNotice.ID, " - ", _tNotice.Name));
            }
            binaryReader.Close();
            this.CheckFileLoaded = 1;
            this.LabelErr.Text = "File Loaded Successfully!";
            this.lbNotice.Items.Clear();
            this.lbNotice.Items.AddRange(this.Menu.ToArray());
        }

Ich habe auch schon versucht binaryReader.ReadBytes(); die Bytes für ein Beispiel nach zu zählen und dann einzugeben gleicher Fehler.
Bei NumArray1 ( byte[] numArray1 = binaryReader.ReadBytes(binaryReader.ReadInt32()); ) tritt dieser Fehler auf .> Fehlermeldung:

EndOfStreamException Über das Ende des Datenstroms hinaus kann nicht gelesen werden.

Ich weiß nicht mehr was ich machen soll. Könnt ihr mir sagen wo mein Fehler ist?

771 Beiträge seit 2009
vor 11 Jahren
Hinweis von herbivore vor 11 Jahren

Ursprünglich gepostet um 10:22:32 als Antwort auf die erste Version der Frage.

Hi,

den Fehler solltest du aber selber mittels des Debuggers schnell rausfinden. Mit "binaryReader.Stream.Position" kannst du dir ja jeweils die aktuelle Position ausgeben lassen.

Ich würde dir auch raten


byte[] numArray = binaryReader.ReadBytes(binaryReader.ReadInt32());

in zwei Anweisungen (bzw. noch besser in eine eigene Methode) zu schreiben, damit du dir explizit den Längen-Wert in einer Variablen anschauen kannst.

Hinweis: du solltest auch besser, die Methode nicht gleichzeitig mit UI-Zugriffen vermischen (Stichwort: Separation of Concerns (SoC)).

849 Beiträge seit 2006
vor 11 Jahren

Hallo XKani,

Also entweder hast Du das Format deiner Datei falsch verstanden oder die Datei ist kaputt.

Am Anfang deiner while schleife fragst Du Position < Length. Im Zweifelsfall ist das aber auch true wenn Du genau ein byte vor ende stehst. In diesem Fall würde dir das sogar schon bei int num1 = binaryReader.ReadInt32(); um die Ohren fliegen.

Ich würde dir vorschlagen die Datei auszudrucken und dann mit dem Kugelschreiber beim debuggen hinterher zu gehen.. (so mach ich das immer) und ich würde ReadBytes(binaryReader.ReadInt32()) der Einfachheit beim Debuggen wegen in zwei zeilen aufteilen.

Eine kleine Sache noch, die man sich beim Debuggen auch bewusst sein sollte.. wenn Du in der Watch binaryReader.ReadInt32() aufrufst, geht der stream dabei auch eine Position weiter.. was dich hierbei dann auch direkt in die nächste Fehler Quelle leiten würde.

Gruss

X
xKani Themenstarter:in
4 Beiträge seit 2012
vor 11 Jahren

Ah ok.
Anscheinend liest er beim erstenmal alles obwohl ich doch angeben hab er soll nur die Anzahl bytes lesen die er vorher rausgelesen hat.

                int num = binaryReader.ReadInt32();
                int num1 = binaryReader.ReadInt32();
                int länge1 = binaryReader.ReadInt32();
                this.label5.Text = länge1.ToString();
                byte[] numArray = binaryReader.ReadBytes(länge1);
                int länge2 = binaryReader.ReadInt32();
                byte[] numArray1 = binaryReader.ReadBytes(länge2);
                int länge3 = binaryReader.ReadInt32();
                byte[] numArray2 = binaryReader.ReadBytes(länge3);
                int länge4 = binaryReader.ReadInt32();
                byte[] numArray3 = binaryReader.ReadBytes(länge4);
                int länge5 = binaryReader.ReadInt32();
                byte[] numArray4 = binaryReader.ReadBytes(länge5);

Klappt auch nicht.

Hinweis von herbivore vor 11 Jahren

Klappt auch nicht

... ist keine ausreichende Fehlerbeschreibung, siehe [Hinweis] Wie poste ich richtig? Punkt 5. Außerdem fällt das Auslesen von Dateien unter die Grundlagen, die wir hier voraussetzen, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Du musst immer damit rechnen, dass das Format der Datei falsch ist und solltest entsprechend robust programmieren bzw. die entsprechenden Exceptions fangen.

Außerdem ist die Fehlermeldung klar und eindeutig. Spätestens mit den Hinweisen, die du erhalten hast, und mit Hilfe des Debuggers solltest du es jetzt selbst hinbekommen.

Thema geschlossen