Laden...

Streamreader ohne Erkennbaren Grund "null"

Erstellt von Mr.BlonD vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.640 Views
M
Mr.BlonD Themenstarter:in
5 Beiträge seit 2015
vor 9 Jahren
Streamreader ohne Erkennbaren Grund "null"

Hallo zusammen,

ich komme hier nicht weiter und weiss nicht, warum meine while-Bedingung bereits nach zwei Durchläufen nicht mehr erfüllt sein soll. Hier der relevante Code-Auszug:


            do
            {
                tokens = s.Split(c);
                for (int i = 0; i < tokens.Length; i++)
                {
                    if (Double.TryParse(tokens[i], out temp))
                    {
                        mw += temp;
                        Console.WriteLine("Check mw addition Token");
                        Console.WriteLine("Token {0}: {1}",i+1,tokens[i]);
                    }
                    else
                    {
                        zError.Add(z);
                        tError.Add(t);
                    }
                    t++;
                }
                amw.Add(temp);
                z++;
                Console.WriteLine("Check mw addition Zeile");
                Console.WriteLine("Aktueller Wert von s: {0}",s);
            } while ((s = sr.ReadLine()) != null);

Die Textdatei enthält folgende Einträge:
12;3;345
7;5;298
9;4;411
10;2;326
5;6;195
4;sieben;120

"s" wird einmal vor der do-while Schleife durch "s = sr.ReadLine();" mit der ersten Zeile aus der Textdatei geladen.

Den letzten Wert im Consolen-Output durch meine Kontrollinstanz "Console.WriteLine("Aktueller Wert von s: {0}",s)" zeigt den Wert "7;5;298"

Jemand ne Idee warum? "sr.ReadLine()" wird ja nur in der while-Schleife ausgeführt und im Code einmal vor dieser Schleife.

Würde mich sehr freuen wenn einer den Wurm hier finden kann. 🙂

Hab grad gesehen, dass hier Anfängerfragen unersagt sind. Aber hab mir jetzt schon die Mühe gemacht alles zu beschreiben. Falls sich dennoch jmd erbarmt wäre ich sehr dankbar. Ansonsten --> delete 🙁

MfG
Mr.BlonD

16.842 Beiträge seit 2008
vor 9 Jahren
C
2.122 Beiträge seit 2010
vor 9 Jahren

Was sagt der Debugger? Schau dir an was die Werte dir sagen wenn die Schleife abbricht.
Ich würd File.ReadAllLines einsetzen und mir ansehen was das für ein Ergebnis bringt.
Wird wirklich die Datei vom Programm eingelesen die du glaubst?

M
Mr.BlonD Themenstarter:in
5 Beiträge seit 2015
vor 9 Jahren

Der Debugger sagt gar nix. Bringt ja kein Fehler sondern bricht die Schleife zu früh ab bzw Schreibt nur die ersten zwei Zeilen aus meiner Textdatei. Ich glaub ich hab nen anhaltspunkt... Es wird in der Schleife mit "s = sr.ReadLine()" nur einmal eine Zeile weitergesprungen. Scheint nur außerhalb zu gehen aber wieso verstehe ich nicht. Hab hier ein komplettn simplen Code für das Problem wo das gleiche Verhalten auftritt:


using System.Text;
using System.IO;
using System.Collections.Generic;

namespace Aufgabenprojekt
{class Mittelwerttest
    {
        
        static void Main()
        {
            string wpath = "D:\\Studium\\GPI\\GPI13";
            Directory.SetCurrentDirectory(wpath);
            string path = "MW.txt";
            StreamReader sr = null;
            string[] tokens = new string[7];
            sr = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read));
            int n = 0;

            do
             {
                tokens[n] = sr.ReadLine();
                n++;
            } while (tokens[n-1] != null);

            foreach (string st in tokens)
            {
                Console.WriteLine("String: {0}", st);
            }
            sr.Close();
            Console.ReadLine();
        }
    }
}

Auch hier die Textdatei "MW.txt" mit Inhalt:
12;3;345
7;5;298
9;4;411
10;2;326
5;6;195
4;sieben;120

Hier spuckt er jetzt die Zeile "10;2;326" aus, weil ich vor der Schleife den StreamReader 3 Mal ins Nirvana hab lesen lassen. Innerhalb der Schleife scheint er den Befehl ".ReadLine()" nur einmal zu machen und dann nicht wieder. Aber warum?

Dake für Eure Hilfe!

MfG
Mr.BlonD

T
2.224 Beiträge seit 2008
vor 9 Jahren

Mein Tipp -> Anstelle vom StreamReader kannst du dir die Zeilen auch durch File.ReadAllLines ausgeben lassen.
Das spart bei dir eine menge gebastle.
Dann bekommst du ein Array mit allen Zeilen und kannst dann die Daten durch parsen.
Ansonsten würde ich deinen aktuellen Code auch so verwerfen.
Nutze eine while Schleife und prüf dann beim StreamReader auf EOF.
Innerhalb der Schleife liest du dann eben mit ReadLine.
do while ist für das lesen von Dateien ein falscher Ansatz.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

M
Mr.BlonD Themenstarter:in
5 Beiträge seit 2015
vor 9 Jahren

okay ich probiers mal die tage. Heut abend bring ich nix mehr zusammen, sitze einfach schon zu lange xD

Bin aber trotzdem noch offen für anregungen, warum der ".ReadLine()" Befehl in der do-while schleife nur einmal ausliest.

MfG
Mr.BlonD

M
53 Beiträge seit 2008
vor 9 Jahren

Moin,

schau mal was du mit deiner Zählervariable 'n' machst, wann du sie erhöhst und wann du sie benutzt.

Gruß
muhtanten

16.842 Beiträge seit 2008
vor 9 Jahren

Du solltest den Artikel zum Thema Debugger vollstaendig durchlesen und das darin vermittelte Wissen anwenden.
Ein Debugger geht Schritt für Schritt jede Codestelle durch. Damit kannst Du 100% nachvollziehen wieso der Code was tut.
Ich leg meine Hand für ins Feuer, dass das nach maximal 10 Minuten mit dem Debugger völlig klar wird, wieso der Code nicht wie gewünscht funktioniert.
Du musst ihn nur mal (korrekt) verwenden.

M
Mr.BlonD Themenstarter:in
5 Beiträge seit 2015
vor 9 Jahren

der tipp von muhtanten mit dem "n" ist richtig und für dieses Beispiel des Problems Lösung. Es funktioniert jetzt zumindest, dass alle Zeilen der File in das String-Feld gelesen werden. Jetzt muss ich nur noch schauen, wieso es im ursprünglichen Programm nicht funktioniert hat.

Was sagt der Debugger? Schau dir an was die Werte dir sagen wenn die Schleife abbricht.
Ich würd File.ReadAllLines einsetzen und mir ansehen was das für ein Ergebnis bringt.
Wird wirklich die Datei vom Programm eingelesen die du glaubst?

... habs gefunden und oben steht der passende Hinweis. Das Programm hat irgendwas eingelesen, aber fragt mich nicht was und wie er an die angegebene Datei "mw.txt" herankam. Denn das aktuelle Verzeichis war nicht das richtige. Korrigiert und schon wird alles eingelesen. Vlt hat er da noch iwas halbes im Speicher gehabt. Wie auch immer, Problem gelöst.

Danke an alle. Eine super hilfe hier!

MfG
Mr.BlonD

16.842 Beiträge seit 2008
vor 9 Jahren

Ich wiederhol mich sehr gerne: sowohl ein Verzeichnisfehler wie auch ein Variablenfehler wie 'n' bekommt man in wenigen Minuten via Debugger heraus.
Nimm die Tipps an, die man Dir hier gibt. Wir sagen das ja nicht umsonst.

Das Programm hat irgendwas eingelesen, aber fragt mich nicht was

Der Debugger würde Dir sagen "was"...

T
2.224 Beiträge seit 2008
vor 9 Jahren

Neben Abts Tipp mal den Debugger zu verwenden, kannst du auch, wie oben von mir empfohlen, mit File.ReadAllLines arbeiten.
Dann hast auch auch ein Array mit dem Zeilen der Datei.
Das spart dir deinen unsauberen Code, der auch noch enorm fehleranfällig ist, und den Overhead dich noch länger mit dem StreamReader zu ärgern um eine relativ einfache Umsetzung zu erledigen.

Aber du solltest dich ernsthafter mit den Basics und vor allem mit dem Ratschlägen der Leute inm Forum auseinander setzen.
Du scheinst aktuell die Ratschläge, die auch absolute Grundlagen sind, zu ignorieren.
Den Debugger zu verwenden hätte dir wahrscheinlich den gesamten Thread erspart.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

W
872 Beiträge seit 2005
vor 9 Jahren

Dir ist wahrscheinlich nicht bewusst, dass Du die Datei nicht aus dem Projektpfad, sondern aus dem Verzeichnis nimmt, wo der Compiler das Ergebnis hinschreibt (meist bin/Release oder bin/Debug).
Wahrscheinlich hast Du in %PATH% noch eine Datei gehabt, die Deine exe gelesen hat.

M
Mr.BlonD Themenstarter:in
5 Beiträge seit 2015
vor 9 Jahren

hey leutz, ich nehm die Ratschläge an. Mit dem Debugger werde ich mich auseinander setzen. Als Anfänger ist man deswegen nicht so offen für neues, weil man erstmal das alte verstehen und zum laufen bringen möchte, bevor man sich an Neues heranwagt, was wieder andere Unverständlichkeiten mit sich bringt (auch wenn der Code besser und weniger umständlich ist).

Vielen Dank an alle. Hat mir sehr weitergeholfen 😃

MfG
Mr.BlonD