StreamReader daran hindern direkt in die nächste Zeile zu springen

CrimeOne

Mitglied
Hallo zusammen

Ich hab in Problem mit dem StreamReader, ich benutze die Visual C++ 2008 Express edition.

Also mein Problem:
Ich hab ne Textbox in der der Benutzer eine Eingabe macht, dann drückt er auf einen Button und seine Eingabe wird mit einer Wort in einer bestimmten Zeile in einer Textdatei (.txt) verglichen.
Dann bekommt der Benutzer ne MessageBox mit dem Ergebnis ob seine Eingabe mit der Textdatei übereinstimmt.

Bis hierhin hab ich alles gut hingekriegt, aber jetzt hab ich das Problem das der StreamReader weitermacht mit dem Auslesen. Sprich wenn in der Textdatei 4 Zeilen stehen, dann bekommt der Benutzer 4 mal ne MessageBox, und net 1mal wie geplant.

Und jetzt meine Frage: wie kann ich dem StreamReader sagen das er immer eine Zeile vergleichen soll, dann die MessageBox -> dann soll der Benutzer wieder ne Eingabe machen -> der StreamReader geht in die nächste Zeile, vergleicht diese -> MessageBox -> usw. bis ende der Datei?

hier ist mal mein Code den ich bisher dazu hab:
Code:
		 /*** 1. Öffnen-Dialog konfigurieren ***/

      // das gerade aktuelle Verzeichnis als Vorgabe in Dialog anzeigen
      openFileDialog1->InitialDirectory = ".";

      // Dateifilter definieren 
      // Jeder Filter besteht aus einem anzuzeigenden Text und 
      // einer Dateiextension - beides getrennt durch |
      // Mehrere Filter werden ebenfalls durch | getrennt
	  openFileDialog1->Filter = "Textdateien (*.txt)|*.txt";

      // Einen Filer auswählen
      openFileDialog1->FilterIndex = 1;

      // Keine Mehrfachauswahl
      openFileDialog1->Multiselect = false;

      // Kein vorgegebener Dateiname
      openFileDialog1->FileName = "";

      /*** 2. Öffnen-Dialog aufrufen ***/
      if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
      {
         /*** 3. Dateiinhalt einlesen ***/
		 String^ Eingabe=textBox1->Text;
                 StreamReader ^sr = nullptr;
         try
         { 
			 
			 sr = gcnew StreamReader(openFileDialog1->FileName, false);
	 
  

	   String ^zeile = "";
		array<Char> ^zeichen = {'-'};
		
		array<String^> ^woerter;
	  
		while (sr->Peek() != -1)
		{
			

			zeile = sr->ReadLine();
			woerter = zeile->Split(zeichen);
			("{0}-{1}-{2}", woerter[0], woerter[1], woerter[2]);

		if (Eingabe == woerter[1])
		{
			MessageBox::Show("Richtig", "Richtig");
		}
		else
		{
			MessageBox::Show("Falsch", "Falsch");
		}
		}
		 }
	  
     catch (Exception ^e)
   {
	   MessageBox::Show("Datei wurde nicht gefunden", "Fehler: ");
   }
   finally
   {
      if (sr)
         sr->Close();
   }
	  }
			 }
 
Hi

Nimm den Teil zum Zeigen der MessageBox doch aus der Schleife raus und mach die Prüfung erst, wenn du fertig bist mit Einlesen.

PS: Es ist zu empfehlen, wenn du .NET Fragen auch im .NET Bereich stellst
 
was meinst du mit rausnehemen?
ich hab des jetzt paar mal versucht, aber entweder der Try Block macht Probleme, oder woerter ist nicht mehr deklariert:confused:

PS: normalerweise schreib ich in das C++ Forum, hab aber dann nen Link gefund
( von den Admins) wo stand: Hier bitte posts die speziell die C++ Programmierung mit VisualStudio betreffen. <- Daraus schließ ich das die Visual C++ meinen oder .NET.
 
so meine ich:
C++:
		array<Char> ^zeichen = {'-'};
		
		array<String^> ^woerter;
	  
		while (sr->Peek() != -1)
		{
			zeile = sr->ReadLine();
			woerter = zeile->Split(zeichen);
			("{0}-{1}-{2}", woerter[0], woerter[1], woerter[2]);
		}
		if (Eingabe == woerter[1])
		{
			MessageBox::Show("Richtig", "Richtig");
		}
		else
		{
			MessageBox::Show("Falsch", "Falsch");
		}
Mit der Aussage macht Problem kann ich so nichts anfangen ;)
bzgl. nicht deklariert:
Dann ist die Deklaration an der falschen Stelle. Wenn die Variable in einem anderen Scope genutzt werden soll, muss sie auch in diesem bekannt sein
 
also was ich mit meiner Definiton "macht Probleme" meinte ich: wenn man ne Klammer zu viel sätz kommt die Meldung das der Try Block keinen catch hat, egal tut auch nix zur sache.

Ich habs jetzt s so gemacht wie du es geschrieben hasch, des Problem ist jetzt das er die erste Zeile liest, sie dann auch vergleicht.
Wenn ich aber jetzt den Text für die zweite Zeile eingeb, muss ich wieder die Textdatei öffnen und dann kommt die Meldung das mein Text aus der Textbox falsch ist, was ja logisch ist weil er ja wieder in der ersten Zeile ist, nicht in der zweiten.

Was ich jetzt bräuchte wäre ne Schleife oder so die den StreamReader dazu zwingt zu warten bis der Benutzer ne Eingabe gemacht hat, dann soll der StreamReader in die nächste Zeile gehen, es vergleichen und zum Schluss die Textbox entleeren -> also den Text löschen. Dann wieder von vorne, solange bis die Datei zu ende ist
 
Ich hätt ne Idee zu meinem Problem, habe aber keine Ahnung ob und wie sie verwirklicht werden kann:

In dem Try Block einfach nen Button erstellen, und den StreamReader erst weiter machen lassen wenn der Button gedrückt wurde, ne Idee wie man das verwirklichen kann?


Achja bezüglich dem Textbox leeren hab ich das jetzt so:
Code:
if (Eingabe == woerter[1])
        {
			MessageBox::Show("Richtig", "Richtig");
			textBox1->Text = "";
		}
		else
		{
			MessageBox::Show("Falsch", "Falsch");
			textBox1->Text = "";
		
		}

Funktioniert auch, jetzt fehlt mir halt noch der Button.
 
lies zuerst alles ein und halte die Zeilen in einer Liste.
Nach dem alles eingelesen wurde, würde ich mit der Prüfung beginnen (mit Liste prüfen).

Über den Index der Liste kommst du ja dann einfach an die Zeilennummer die du prüfen willst.
 
könntest du mir ein Code beispiel geben?
Ich benutzt .NET erst seit zwei drei wochen, bin also totaler neuling auf dem gebiet..;)
 
C#:
List<string> zeilen=new List<string>(); //Liste hält die eingelesenen Zeilen

using(StreamReader sr=new StreamReader(meineDatei))
{
    string s;
    while((s = sr.ReadLine()) != null) //solange laufen wie Zeilen in Datei
         zeilen.Add(s); //eingelesene Zeile der Liste hinzufügen
}

if(Eingabe==zeilen[2]) //Eingabe mit Zeile 3 abprüfen (Index beginnt bei 0)
{
     ...
}
so ungefähr
 
Zuletzt bearbeitet von einem Moderator:
Sorry irgendwie hab ich grad den total hänger... wo soll ich denn den List Code jetzt hinen?

Ich hätt noch ne Frage:

Warum kann ich net bei
Code:
try
{
       // hier ein Button einbauen, das Programm müsste ja dann erst warten bis der   

 //Button gedrückt wurde, um dann die Eingabe zu prüfen, dadurch hat der Benutzer
 //genügend zeit eine neue Eingabe zu machen, und wenn das Programm in die
 //nächste Zeile kommt, -> beginnt es ja wieder am Anfang des try Blocks, und ürde
 //auch wieder auf den Button treffen...
.....
.....
.....
.....      
}
 

Neue Beiträge

Zurück