Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Datei auslesen mit BinaryReader: EndOfStreamException
xKani
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

Datei auslesen mit BinaryReader: EndOfStreamException

beantworten | zitieren | melden

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 .
Fehler
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?
Attachments
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 790

beantworten | zitieren | melden

Moderationshinweis von herbivore (16.12.2012 - 13:59:27):

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)).
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
xKani
myCSharp.de - Member



Dabei seit:
Beiträge: 6

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (16.12.2012 - 14:37:55):

Zitat
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.