Laden...

while macht Probleme

Erstellt von xpHelper vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.769 Views
X
xpHelper Themenstarter:in
92 Beiträge seit 2007
vor 14 Jahren
while macht Probleme

Hallo Leute,

ich habe ein Problem mit meiner while Schleife :S. Hier erstmal der Code.


            while ((line = sr.ReadLine()) != null)
            {
                MessageBox.Show("Ebene 1");
                if (line == fullIP)
                {
                    sr.Close();
                    MessageBox.Show("This server could not be added. Maybe already in your list?", "Not added", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    break;
                }
                else
                {
                    sr.Close();
                    using (StreamWriter sw = new StreamWriter("C:/WINDOWS/serverchecker/masterfile.txt", true))
                    {
                        sr.Close();
                        sw.WriteLine(fullIP);
                        sw.Close();
                    }
                    MessageBox.Show("Server was succesfully added to your favorites", "Server added!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                }
            }

Ich habe mal zum debuggen eine MessageBox eingefügt. Diese wird aber nicht angezeigt obwohl die Schleife eigentlich laufen müsste wenn ich auf meinen Button klicke.

Was ist hier los?

Gruß Philipp

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo xpHelper,

versuche es mal mit debuggen.
So müsste das eigentlich funktioniert aber man kann da eigentlich nix zu dem Code sagen.
Er geht wahrscheinlich nie in die schleife rein.
Also debuggen

Gruss
MIchael

5.742 Beiträge seit 2007
vor 14 Jahren

Hallo xpHelper,

ich kann mich michlG voll und ganz anschließen: Debuggen!
Um welche Messagebox geht es denn überhaupt?

Aber wozu brauchst du eigentlich eine Schleife, wenn du im ersten Durchgang ja sowieso deinen StreamReader schließest (und dazu die Schleife noch per break abrichst)?!?

BTW: Einmal schließen reicht übrigens völlig - noch besser ist ein using (was du ja auch schon in einem Fall verwendest).

X
xpHelper Themenstarter:in
92 Beiträge seit 2007
vor 14 Jahren

Hmmm...

Hier der relevante Code:

            StreamReader sr = new StreamReader("C:/WINDOWS/serverchecker/masterfile.txt");
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                if (line == fullIP)
                {
                    MessageBox.Show("Test");
                    sr.Close();
                    MessageBox.Show("This server could not be added. Maybe already in your list?", "Not added", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    break;
                }
                else
                {
                    sr.Close();
                    using (StreamWriter sw = new StreamWriter("C:/WINDOWS/serverchecker/masterfile.txt", true))
                    {
                        sr.Close();
                        sw.WriteLine(fullIP);
                        sw.Close();
                    }
                    MessageBox.Show("Server was succesfully added to your favorites", "Server added!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                }
            }

bis zum string line; "fährt" er noch, danach ist schluss warum auch immer. Meine Haltestelle wird bei while nicht mehr abgefahren.

@Winsharp93

Im welchen ersten Durchgang. Solange if oder else nicht eintrifft passiert garnichts,
Gruß

J
237 Beiträge seit 2008
vor 14 Jahren

Doch, wegen des breaks und sr.Close() in if und else.

Grüße, JasonDelife.

Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.

5.742 Beiträge seit 2007
vor 14 Jahren

Solange if oder else nicht eintrifft passiert garnichts

Ja - und das kann nur der Fall sein, wenn der JIT-Compiler fehlerhaft arbietet oder dein RAM defekt ist 😉

115 Beiträge seit 2008
vor 14 Jahren

Hallo xHelper,

  
            while ((line = sr.ReadLine()) != null)  
            { ...  
  

Ich kann da auf anhieb auch keinen Fehler feststellen. Probier doch statt dessen mal ein Do-While-Schleife. Da wird der erste Schleifenduchgang ja auf jeden Fall durchlaufen.

Dann kannst Du im Debugger auch wenigstens mal vernünftig sehen, welche Werte in Deine Variable geschrieben werden.

Doch, wegen des breaks und sr.Close() in if und else.

Er sagt doch, dass if und else gar nicht ausgeführt wird! Ausserdem hat er ja schon seinen Wert aus dem StreamReader in eine Variable geschrieben. Von daher macht das sr.Close() ja keinen Unsinn...

Grüße,
der Michael

X
xpHelper Themenstarter:in
92 Beiträge seit 2007
vor 14 Jahren

Ich versteh immoment garnichts, was nicht an euch liegt.

Ich hab mal etwas korrigiert 😛

while ((line = sr.ReadLine()) != null)
            {
                MessageBox.Show("Ebene 1");
                if (line == fullIP)
                {
                    if (sr.EndOfStream)
                    {
                        MessageBox.Show("This server could not be added. Maybe already in your list?", "Not added", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                        break;
                    }
                }
                else
                {
                    sr.Close();
                    using (StreamWriter sw = new StreamWriter("C:/WINDOWS/serverchecker/masterfile.txt", true))
                    {
                        sr.Close();
                        sw.WriteLine(fullIP);
                        sw.Close();
                    }
                    MessageBox.Show("Server was succesfully added to your favorites", "Server added!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    break;
                }
            }

Meine Interpretation ist:

Solange bis der String keinen Inhalt mehr hat wird der nachfolgende Code ausgeführt.Hier soll als erstes eine MessageBox angezeigt werden (was nicht geschieht).

Danach soll wenn line , fullIP übereinstimmt und der Stream am Ende ist eine MessageBox angezeigt werden und die Schleife mit break geschlossen werden.

Andernfalls (else) wird der StreamReader geschlossen da wir ihn nicht mehr brauchen weil wir ja haben nach was wir suchen (und das ist in dem Fall die Frage ob fullIp schon im masterfile.txt enthalten ist).

Da fullIP noch nicht im masterfile.txt enthalten ist wollen wir das schnell nachholen was auch mit StreamWriter geschieht.

Das alles wird mit MessageBox noch eben dem User gesagt und die Schleife wird mit break zu Ende gebracht.


Doch das alles trifft nicht ein. Selbst die erste MessageBox nicht.

Keine Ahnung was hier falsch sein kann.

@Lumbra

Danke. Das probiere ich mal so meld mich gleich nochmal 😉

Gruß

Philipp

3.430 Beiträge seit 2007
vor 14 Jahren

Hi

Er sagt doch, dass if und else gar nicht ausgeführt wird! Ausserdem hat er ja schon seinen Wert aus dem StreamReader in eine Variable geschrieben. Von daher macht das sr.Close() ja keinen Unsinn...

Naja. Viel Sinn macht es aber in diesem Fall nicht eine Schleife zu verwenden.
Wenn er doch eh im ersten Durchlauf den StreamReader schliesst wird er im Zweiten auf nicht mehr viel lesen können 😃

Also wenn du nur einen Eintrag hast dann kannst du dir die Schleife sparen und sonst
den Streamreader nicht schliessen

PS: Mit der modifizierten Version macht es nun mehr Sinn =)

Doch das alles trifft nicht ein. Selbst die erste MessageBox nicht.

D.h. dass er gar nicht erst in die Schleife rein geht.
Also trifft die Fortsetzungsbedingung zu (sr.ReadLine() == null)

Gruss
Michael

X
xpHelper Themenstarter:in
92 Beiträge seit 2007
vor 14 Jahren

Okay... Anscheinend ist do-while für den Compiler Attraktiver und es funktioniert.

Danke für die Zahlreiche Hilfe

115 Beiträge seit 2008
vor 14 Jahren

(Ich will den Beitrag jetzt nicht nochmal editieren, daher noch eine Ergänzung...)


do
{
    String line;
    line = sr.ReadLine();

    if (line == null)
    {
        break;
    }

    ... Der Rest Deines Code - ohne 'break' und ohne 'sr.Close()'
}
while (!sr.EndOfStream);

Wenn der Stream also von vornherein leer ist, wird die Schleife sofrot abgebrochen - ansonsten wird Dein Code ausgeführt.

Das sr.close() solltest Du dann aber unterlassen, sonst passt Deine Abbruchbedingung nicht mehr (sag ich jetzt ohne das ausprobiert zu haben).

Das break solltest Du ebenfalls in Deiner if-else-Verzweigung weglassen, falls Du mehrere IP-Adressen hinzufügen willst.

Wenn Du aber immer nur eine IP hinzufügen willst, dann brauchst Du aber nicht wirklich die Schleife. Dann reicht Dein Code...

(Alternativ geht statt do-while auch ein foreach)

Grüße,
der Michael

115 Beiträge seit 2008
vor 14 Jahren

Falls Du mal rausfinden willst, warum Deine Schleife nicht funktioniert - verlager mal das "line = sr.ReadLine()" vor die selbige - vielleicht siehst Du dann ja, was da passiert...

Grüße,
der Michael

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo zusammen,

warum eigentlich immer das ganze Rumhantiere mit StreamReadern?
Ein...

foreach (string line in File.ReadAllLines("C:/WINDOWS/serverchecker/masterfile.txt"))
{
   // ...
}

... hätte es doch auch getan.
Und dein Writerkonstrukt kannst du allein mit File.WriteAllText(...) erschlagen.

Für alle grundlegenden Dateioperationen hat die File-Klasse schon Member, die das können. Man muss nicht immer alles selbst lowlevel machen...

Gruß,
dN!3L

S
21 Beiträge seit 2009
vor 14 Jahren

Hmmm...

Hier der relevante Code:

            StreamReader sr = new StreamReader("C:/WINDOWS/serverchecker/masterfile.txt");  
...  

vl weil der pfad nicht "C:/WINDOWS/serverchecker/masterfile.txt", sondern "C:***WINDOWS**serverchecker***masterfile.txt" heißen sollte?

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Sekkiy,

vl weil der pfad nicht "C:/WINDOWS/serverchecker/masterfile.txt", sondern "C:***WINDOWS**serverchecker***masterfile.txt" heißen sollte?

Das ist Windows total egal.

Gruß,
dN!3L