BinaryWriter problem
-
Hallo,
ich habe ein Programm die Daten von eine Binäre Datei über ein Formular in TextBoxen lesen. Alles funktioniert einwandfrei. Aber beim Schreiben, wird die Binäre Datei anders geschrieben wie es vorher war und wenn ich versuche die Datei nochmals zu lesen, bekomme ich einen EndOfStream Ausnahme.
Das Problem ist, sowohl die Punkte als auch die Namen in eine Zeile zurückgeschrieben werden und beim zurücklesen ist alles ini einem Array.
Im konstruktor habe ich bereits static arrays definiert:
//Arrays für den Dateninhalt die Binäre Datei //und zum platzieren in den Textboxen static array <String^> ^listPunkte = gcnew array <String^>(10); static array <String^> ^listName = gcnew array <String^>(10); static array <String^> ^listGesamt = gcnew array <String^>(20);
Hier ist die Quelltext für das lesen.
private: System::Void buttonLesen_Click(System::Object^ sender, System::EventArgs^ e) { 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 die Dateninhalt durch das entsprechende //Format aus die Datei gelesen for (Int32 i = 0; i < 10; i++) { //die Punkte und Namen im separaten Array einlesen listPunkte[i] = binaerDatei->ReadInt32().ToString(); listName[i] = binaerDatei->ReadString(); } //Hier werden die zwei Arrays in einem zusammengefasst //Hier werden die Punkte am anfang der Array eingelesen listPunkte->CopyTo(listGesamt,0); //Hier werden die Namen am ende die Punkte sozusagen "angehängt" //und im array eingelesen listName->CopyTo(listGesamt, listPunkte->Length); //Hier wird das neues Array verwendet damit alle 20 elemente //in die Textboxen dargestellt //für das Array Int32 x = 0; for each (Control ^element in this->Controls) { if (dynamic_cast<TextBox^>(element) != nullptr) { element->Text = listGesamt[x]; x++; } } //BinaryReader schließen binaerDatei->Close(); //FileStream auch schließen fStream->Close(); } }
und jetzt das Schreiben
private: System::Void buttonSchreiben_Click(System::Object^ sender, System::EventArgs^ e) { //die Datei über FileStream Öffnen FileStream ^fStream = gcnew FileStream("C:\\temp\\score.dat", FileMode::Create, FileAccess::Write); //eine neue Instanz von BinaryWriter auf der Basis von fStream erzeugen BinaryWriter ^binaerDatei = gcnew BinaryWriter(fStream); //TextBoxen inhalt wieder im Array listGesamt einlesen //wegen änderung, //für das Array Int32 x = 0; for each (Control ^element in this->Controls) { if (dynamic_cast<TextBox^>(element) != nullptr) { listGesamt[x] = element->Text; x++; } } //dann aufsplitten in zwei kleinere Arrays //die jeweils größe 10 haben bzw. listPunkte und listName Array::Resize(listPunkte,listGesamt->Length); listGesamt->Copy(listGesamt,0,listPunkte,0,10); Array::Resize(listName,listGesamt->Length); listGesamt->Copy(listGesamt,10,listName,0,10); //erneut schreiben über einen for Schleife. for (Int32 i = 0; i < 10; i++) { binaerDatei->Write(listPunkte[i]); binaerDatei->Write(listName[i]); } //BinaryWriter schließen binaerDatei->Close(); //FileStream schließen fStream->Close(); }
Beim Schreiben, zerlege ich das Array von 20 elementen und bei der Copy Vorgang gebe ich den Quell-Array und sein start Index genauso bei das Ziel-Array und dann setze ich die größe der jeweiligen Ziel-Arrays. Kann mir bitte jemand hier helfen?
Danke.
-
Hallo kev36,
welchen Sinn haben denn die beiden Array::Resize()-Aufrufe in der Schreiben-Methode
Array::Resize(listPunkte,listGesamt->Length); Array::Resize(listName,listGesamt->Length);
?
Allerdings frage ich mich sowieso, warum du drei Arrays dafür benötigst (anstatt nur eins)?
Noch besser wäre es, du würdest einfach ein Array deiner TextBoxen verwalten. Dann könntest du direkt mit diesen arbeiten (anstatt immer wieder diese aus der Control-Collection zu holen):
array <TextBox^> ^listTextBoxes;
(bzw. noch besser wäre eine List<...>!)
-
Es gibt eine Bestenliste mit 10 einträge. In einem anderen Programm werden die Liste in eine Binär Datei geschrieben. Mein Ziel ist es, diese Datei erneut auslesen editieren und erneut schreiben, dies soll immer möglich sein.
Daher habe ich ein separates Formular mit 20 Textboxen, in eine Spalte der TextBoxen werden die Punkte aufgelistet und in die andere Spalte die passende Namen dazu.Weil die Daten über Arrays in die Binär Datei geschrieben werden, muss ich auch das gleiche Methode anwenden zum auswerten.
Daher zwei Arrays die maximale 10 elemente haben können, ein Arry für die 10 Punkte und ein andere Array für die 10 Namen dazu.
Aber wie Du sagst, habe ich in der falsche Richtung gedacht. Mit dem Thema List<....> kenne ich gar nicht, wenn um Generics oder sonst was zu tun, kommt in das nächste Studienheft. Daher kann ich nicht für diese Aufgabe verwenden.