BinaryReader und TextBoxes



  • Hallo,

    ich arbeite an einem Projekt und komme nicht weiter. Ich zeige gleich den Quelltext. Wenn jemand mir vielleicht einen Hinweis geben kann.

    Es gibt einen Binär Datei die information enthält, zum einen sind Zahlen und zum anderen Text, ich möchte gern die daten von diese Binär Datei auslesen und in TextBoxen darstellen. Es gibt 20 TextBoxes und 10 davon sollen die Zahlen darstellen und die andere Zehn sollen den Text

    Die Binär Datei enthält 10 einträge z.B.

    22 Schmidt
    10 Wagner
    104 Müller

    etc...

    Hier ist der Quelltext was ich bis jetzt habe:

    private: System::Void buttonLesen_Click(System::Object^  sender, System::EventArgs^  e) {
    
    				 String ^zahl;
    				 String ^name;
    
    				 if (File::Exists("C:\\Temp\\score.dat")) {
    
    					 //die Datei über FileStream erzeugen
    					 FileStream ^fStream = gcnew FileStream("C:\\Temp\\score.dat", FileMode::Open, FileAccess::Read);
    
    					 //eine neue Instanz von BinaryReader auf der Basis
    					 //von fStream erzeugen
    					 BinaryReader ^binaerDatei = gcnew BinaryReader(fStream);
    
    					 //Diese Schleife liest die Punkte und namen aus
    					 for (Int32 i = 0; i < 10; i++) {
    
    						 zahl = binaerDatei->ReadInt32().ToString();
    						 name = binaerDatei->ReadString();
    					 }
    
    					 //Die Werte irgendwie in den Textboxen darstellen
    					 for each (Control ^element in this->Controls) {
    
    						 if (dynamic_cast<TextBox^>(element) != nullptr) {
    
    							 element->Text = zahl;
    							 element->Text = name;
    						 }					 	 
    					 }
    
    					 //BinaryReader schließen				 
    					 binaerDatei->Close();
    
    					 //FileStream auch schließen				
    					 fStream->Close();
    				 }
    			 }
    

    ich sehe wo das Problem liegt und zwar an die erste Schleife, erst wird er durchgearbeitet bevor er dann an die Schleife bzw. liste der Textboxes D.h. er bekommt nur der letzter eintrag von der Datei. Kann jemand mir einen Hinweis geben, wie ich die Daten an den Textboxen bringe?

    Kann es sein dass ich in der erste Schleife, die Daten jeweils in einem Array speichern?

    Danke.



  • Kev36 schrieb:

    Kann es sein dass ich in der erste Schleife, die Daten jeweils in einem Array speichern?

    Ja, das wäre eine Möglichkeit - alternativ kannst du die Werte gleich in deine Textboxen werfen. (übrigens überschreibst du in der zweiten Schleife auch die Zahl mit dem Namen)



  • Danke für die Information, leider kann ich nicht in der erste Schleife direkt in den textboxen werfen weil 20 Textboxen vorhanden sind. Die schleife läuft nur 10 mal durch dann ist er am ende der Datei sozusagen. Ich bekomme sonst einen EndOfStream Ausnahmebehandlung.



  • Dann wäre auch noch die zweite Möglichkeit, erst innerhalb der foreach-Schleife die Werte aus der Datei zu holen (jeweils abwechselnd eine Zahl und den dazugehörigen Namen). Oder du verwendest ein Array, um die Werte zwischenzuspeichern.



  • Ist das File Format vorgegeben?
    Wenn nicht: wechsle zum einer Text Form (Plain Text / XML / JSON / ...)



  • Ja das File Format ist vorgegeben bzw. als Binäre Datei. Ich werde versuchen was CStoll meinte und die Werte in einem Array vom Typ String speichern, ich werden dann 20 elemente im Array haben.

    Wenn ich eine lösung habe, werde ich es hier zur Verfügung machen damit es andere Leute helfen kann.



  • Ich habe jetzt den Code angepasst damit die Daten in arrays gelesen werden. Hier den Quelltext

    private: System::Void buttonLesen_Click(System::Object^  sender, System::EventArgs^  e) {
    
    				 array <String^> ^listPunkte = gcnew array <String^>(10);
    				 array <String^> ^listName = gcnew array <String^>(10);
    				 //array <String^> ^list = gcnew array <String^>(20);
    
    				 if (File::Exists("C:\\Temp\\score.dat")) {
    
    					 //die Datei über FileStream erzeugen
    					 FileStream ^fStream = gcnew FileStream("C:\\Temp\\score.dat", FileMode::Open, FileAccess::Read);
    
    					 //eine neue Instanz von BinaryReader auf der Basis
    					 //von fStream erzeugen
    					 BinaryReader ^binaerDatei = gcnew BinaryReader(fStream);
    
    					  for (Int32 i = 0; i < 10; i++) {
    
    						 listPunkte[i] =  binaerDatei->ReadInt32().ToString();
    						 listName[i] = binaerDatei->ReadString();
    					  }
    
    					  for each (String ^eintrag in listPunkte)
    
    						  MessageBox::Show("Punkte: " + eintrag);
    
    					  for each (String ^eintrag in listName)
    
    						  MessageBox::Show("Namen: " + eintrag);
    
    					  Int32 x = 0;
    
    					  //die Werte auslesen und in die TextBoxen schreiben 
    					  for each (Control ^element in this->Controls) {
    
    						  if (dynamic_cast<TextBox^>(element) != nullptr) {
    
    								  element->Text = //Hier das Array
    								  x++;
    						  }		 
    					  }
    
    					  //BinaryReader schließen
    					  binaerDatei->Close();
    
    					  //FileStream auch schließen
    					  fStream->Close();
    				 }
    			 }
    

    gibt es die Möglichkeit zwei arrays nochmals in einem andere zu speichern? dann hätte ich 20 einträge die ich dann in die Textboxen einsetzen kann.



  • Hallo,

    wie besprochen hier ist die Lösung für das Problem:

    private: System::Void buttonLesen_Click(System::Object^  sender, System::EventArgs^  e) {
    
    		array <String^> ^listPunkte = gcnew array <String^>(10);
    		array <String^> ^listName = gcnew array <String^>(10);
    		array <String^> ^list = gcnew array <String^>(20);
    
    		if (File::Exists("C:\\Temp\\score.dat")) {
    
    			//die Datei über FileStream erzeugen
    			FileStream ^fStream = gcnew FileStream("C:\\Temp\\score.dat", FileMode::Open, FileAccess::Read);
    
    			//eine neue Instanz von BinaryReader auf der Basis
    			//von fStream erzeugen
    			BinaryReader ^binaerDatei = gcnew BinaryReader(fStream);
    
    			//Hier wird Daten durch das entsprechende
    			//Format aus die Datei gelesen
    			for (Int32 i = 0; i < 10; i++) {
    
    				listPunkte[i] =  binaerDatei->ReadInt32().ToString();
    				listName[i] = binaerDatei->ReadString(); 
    			}
    
    			//Hier werden die beide Arrays in einem
    			//zusammengefasst.
    			listPunkte->CopyTo(list,0); 
    			listName->CopyTo(list,listPunkte->Length);
    
    			//Nur zum testen
    			/*for each (String ^eintrag in list)
    
    				MessageBox::Show("Info: " + eintrag);*/
    
    			//für das neues Array 
    			Int32 x = 0;
    
    			//die Werte auslesen und in die 20 TextBoxen schreiben 
    			for each (Control ^element in this->Controls) {
    
    				if (dynamic_cast<TextBox^>(element) != nullptr) {
    
    					element->Text = list[x];
    					x++;
    				}		 
    			}
    
    			//BinaryReader schließen
    			binaerDatei->Close();
    
    			//FileStream auch schließen
    			fStream->Close();		 
    		}			 
    }
    

Anmelden zum Antworten