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
while macht Probleme
xpHelper
myCSharp.de - Member



Dabei seit:
Beiträge: 92

Themenstarter:

while macht Probleme

beantworten | zitieren | melden

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

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 92

Themenstarter:

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 237
Herkunft: Anywhere in Worldwide BW ;)

beantworten | zitieren | melden

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

Grüße, JasonDelife.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von JasonDelife am .
Beim Programmieren löst man die Probleme, die man nicht hätte, programmierte man nicht.
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von xpHelper
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
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

beantworten | zitieren | melden

Hallo xHelper,
Zitat von xpHelper


            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.
Zitat von JasonDelife
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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lumbra am .
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
xpHelper
myCSharp.de - Member



Dabei seit:
Beiträge: 92

Themenstarter:

beantworten | zitieren | melden

Ich versteh immoment garnichts, was nicht an euch liegt.

Ich hab mal etwas korrigiert :P

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

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 92

Themenstarter:

beantworten | zitieren | melden

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

Danke für die Zahlreiche Hilfe
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

beantworten | zitieren | melden

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

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 21

beantworten | zitieren | melden

Zitat von xpHelper
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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Sekkiy am .
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 2.891

beantworten | zitieren | melden

Hallo Sekkiy,
Zitat von 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
private Nachricht | Beiträge des Benutzers