Entwickler-Ecke

IO, XML und Registry - Streams speichert jeweils nur eine Zeile ab


Orothred - Do 13.09.07 10:37
Titel: Streams speichert jeweils nur eine Zeile ab
So, Versuch nummer 3. Also, mein problem sollte ja mittlerweile bekannt sein, aber nochmal:

ich will in meinem Programm Kopfrechentrainer (siehe Freeware-Projekte) die Ergebnisse eines Spiels in einer Text-Datei speichern. Allerdings wird der Datensatz immer wieder überschrieben und ich finde jeweils nur einen datensatz in der textdatei

was kann ich da tun?


Christian S. - Do 13.09.07 10:39

Je nachdem, mit welcher Methode Du die Datei zum Schreiben öffnest (hier wäre der Quelltext hilfreich), kannst Du meist als zweiten Parameter einen Modus-Angeben. In den meisten Fällen gibt es dann einen "append"-Modus. Aber wie gesagt: Präziser kann man Dir nur Antworten, wenn Du ein wenig von Deinem Quelltext zeigst.


bd.cole - Do 13.09.07 10:40

Wäre gut wenn du Zu deinen Fragen immer den Teil von deinem Code postest um den es geht.
Aber ich denke du kannst eine List<MeineDaten> oder so machen und dann immer die Ergebnisse immer zufügen. Und die Liste dann in die Datei schreiben. Oder willst du dort auch noch die Ergebnisse vom letzten Spiel haben?
Mfg Cole


Orothred - Do 13.09.07 10:42


C#-Quelltext
1:
2:
3:
4:
5:
6:
// Highscores in Textdatei speichern
            string Datei = "Highscore.txt";
            FileStream fs = File.OpenWrite(Datei,);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "   " + Punkte + " von " + Anzahl + " Punkte in " + String.Format("{0:00}:{1:00}", Zeit.Minutes, Zeit.Seconds) + " Minuten");
            sw.Close();


Die Append-Methode würde funktionieren, allerdings weiß ich jetzt nicht genau, wo ich die einbinden muss. außerdem speichert die Append-Methode den nächsten Datensatz ans ende der Datei, ich würde gerne an den anfang speichern

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


JüTho - Do 13.09.07 10:58

Hallo,

für Textdateien gibt es ein ganz einfaches Verfahren:

C#-Quelltext
1:
2:
3:
4:
5:
6:
using System.IO;
string filename = "Highscore.txt";
//  erzeuge die neue Zeile
string myLine = DateTime.Now.ToShortDateString() + "..." + " Minuten") + Environment.NewLine;
//  einfach anhängen
File.AppendAllText(filename, myLine);

Du musst nur beachten, dass an den Anfang oder an das Ende CR/LF gehört. Dieses Verfahren ist auch geeignet, wenn ein Buffer aus mehreren neuen Einträgen gespeichert werden kann.

Zusatzbemerkungen: Benutze doch String.Format() für den gesamten String; das macht es einfacher (und vielleicht auch schneller, weil nicht soviel zwischen verschiedenen Strings und Konvertierungen hin- und hergesprungen werden muss). Den neuen Eintrag an den Anfang zu setzen, geht nur dadurch, dass die gesamte bisherige Datei kopiert werden muss; am einfachsten ist es wahrscheinlich so:

C#-Quelltext
1:
2:
3:
//  bitte kontrollieren, nur aus der Erinnerung geschrieben
string newText = myLine + File.ReadAllText(filename);
File.WriteAllText(filename, newText);

Gruß Jürgen


Orothred - Do 13.09.07 11:03

vielen dank, habs hinbekommen