Entwickler-Ecke
Basistechnologien - Dateihandling Grundlagen
interessierter - Do 17.05.12 18:47
Titel: Dateihandling Grundlagen
Hallo Zusammen
Ich habe in meinem C# Grundlagenlehrgang ein neues Kapitel erreicht, die Grundlagen des Dateihandlings. Ich finde das im Vergleich zu dem was ich bis jetzt gemacht habe ziemlich komplex, deswegen will ich mich Schrittweise in die neue Materie einarbeiten.
Als 1. Übungsprogramm will ich eine Abfrage nach erreichter Punktzahl machen und dies in einer Datei speichern. Mein Ziel ist es, das ich mein Konsolenprogramm neu starten kann und die neue Eingabe (Punktzahl) zur bestehenden Punktzahl, die in der Datei gespeichert ist, addieren kann. Die Ausgabe muss immer das Total an Punkten anzeigen.
Ich habe mich bezüglich StreamWriter und StreamReader im Internet eingelesen und weiss auch wie ich es initialisieren muss. Jedoch verstehe ich im Moment überhaupt nicht wie ich diese Codes in der Praxis anwenden kann.
Anhand des folgenden Codes klappt es, das eine neue Datei auf dem Desktop gespeichert wird, wo auch die Punktzahl ersichtlich ist.
Meine Frage:
Wie kann ich mittels einer neuen Eingabe erreichen, das die Punktezahlen jeweils immer addiert werden und in der gleichen Datei gespeichert werden? Ich habe unzählige Varianten versucht den StreamReader einzusetzten, jedoch ohne Erfolg. Ich hoffe jemand kann mir weiterhelfen.
Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("Wieviele Punkte hast du beim 10km Lauf erzielt?"); string Punkte = Console.ReadLine(); int Gesamtpunktzahl = int.Parse(Punkte);
Console.WriteLine(Gesamtpunktzahl + " Punkte");
Console.WriteLine("Dateiname eingeben"); string Pfad = "C:/Users/x/desktop/" + Console.ReadLine(); StreamWriter PunkteTotal = new StreamWriter(Pfad); PunkteTotal.WriteLine(Gesamtpunktzahl); PunkteTotal.Close(); } } } |
Grüsse
interessierter
Christian S. - Do 17.05.12 19:31
Hallo!
Du musst den Reader erst einmal genauso initialisieren wie den Writer. Dann benutzt Du die Methode
ReadLine, um die Punktzahl einzulesen. Anschließend (nach Konvertierung in einen int) kannst Du die vom User eingegebene Punktzahl dazu addieren. Und dann das ganze schreiben, wie Du es ja bereits tust.
Noch ein paar Hinweise:
Für alles, was irgendwelche Handles auf Systemressourcen (z.B. Dateien) hält, bietet sich die using-Klausel an, die sicherstellt, dass die Ressourcen auch wieder freigegeben werden:
C#-Quelltext
1: 2:
| using(StreamWriter PunkteTotal = new StreamWriter(Pfad)) PunkteTotal.WriteLine(Gesamtpunktzahl); |
Wie Du siehst, spart man sich dabei das "Close", das macht die using-Anweisung.
Außerdem solltest Du den Pfad für ein Windows-System so angeben:
@"C:\Users\x\desktop\". Das "@" sorgt dafür, dass die Backslashes nicht als Escape-Zeichen interpretiert werden.
Grüße,
Christian
interessierter - Fr 18.05.12 21:38
Oke, danke erst mal für die zusätzlichen Inputs. Aber ich verstehe folgendes noch nicht:
Wo genau muss ich den Reader initialisieren und wie kriege ich hin das er die gewünschte Datei liest? Wenn ich den Reader neu initialisiere muss ich ja auch einen Pfad eingeben. Dieser Pfad existiert aber bereits. So wie ich das jetzt sehe habe ich am Schluss zwei Dateien.
Ich blicke irgendwie voll nicht durch in dieser Sache
Christian S. - Fr 18.05.12 21:47
Hallo!
Die Datei muss ja existieren, sonst könntest Du ja nicht draus lesen ;-) Das solltest Du übrigens mit
File.Exists(Pfad) prüfen, bevor Du den StreamReader initialisierst.
Was das initialisieren angeht: wie gesagt, das sieht genauso aus wie beim StreamWriter: Du erstellst den StreamReader mit
new und unter Angabe des Pfades! Dieser StreamReader hat dann eine
ReadLine-Methode, die genauso funktioniert wie von der
Console.
Und dass Du am Ende keine zwei Dateien hast, liegt daran, dass der StreamWriter eine bestehende Datei überschreiben wird.
Das Vorgehen ist also:
- Neue Punktzahl vom Benutzer abfragen
- Dateiname vom Benutzer abfragen
- Mittels StreamReader alte Punktzahl aus Datei lesen (falls Datei existiert)
- Summe aus alter und neuer Punktzahl bilden
- Die Summe mittels StreamWriter in die Datei schreiben
Grüße,
Christian
interessierter - Fr 18.05.12 22:52
Ich glaube bis Punkt drei habe ich es jetzt richtig gemacht. Stimmt das mal? Werde Code folgend posten. Mit Schritt 4 habe ich Mühe, im Code sieht man meinen Versuch die Summe aus der aktuellen und der neuen Punktzahl zu bilden. Anschliessend werde ich mich noch mit Punkt 5 befassen.
Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
Console.WriteLine("Wieviele Punkte hast du beim 10km Lauf erzielt?"); string Punkte = Console.ReadLine(); int Gesamtpunktzahl = int.Parse(Punkte); Console.WriteLine(Gesamtpunktzahl + " Punkte");
Console.WriteLine("Dateiname eingeben"); string Pfad = @"C:/Users/daniele/desktop/" + Console.ReadLine(); using(StreamWriter PunkteTotal = new StreamWriter(Pfad)) PunkteTotal.WriteLine(Gesamtpunktzahl);
if (File.Exists(Pfad)) { var AktuellePunkte = new StreamReader(Pfad); var text = AktuellePunkte.ReadLine(); AktuellePunkte = AktuellePunkte + Gesamtpunktzahl; Console.WriteLine(AktuellePunkte); }
} } } |
Christian S. - Fr 18.05.12 23:20
ReadLine liefert genau wie bei der Console einen String, den Du erst in einen int umwandeln musst ;-)
interessierter - Fr 18.05.12 23:41
oke, ist nun geparst :)
Nun beim letzen Schritt, dem Schreiben in die existierende Datei klappts noch nicht. Wo liegt hier der Fehler?
Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("Wieviele Punkte hast du beim 10km Lauf erzielt?"); string Punkte = Console.ReadLine(); int Gesamtpunktzahl = int.Parse(Punkte); Console.WriteLine(Gesamtpunktzahl + " Punkte");
Console.WriteLine("Dateiname eingeben"); string Pfad = @"C:/Users/daniele/desktop/" + Console.ReadLine(); using(StreamWriter PunkteTotal = new StreamWriter(Pfad)) PunkteTotal.WriteLine(Gesamtpunktzahl);
if (File.Exists(Pfad)) { var AktuellePunkte = new StreamReader(Pfad); var x = AktuellePunkte.ReadLine(); int PunkteAktuell = int.Parse(x); PunkteAktuell = PunkteAktuell + Gesamtpunktzahl; using (StreamWriter PunkteTotal = new StreamWriter(Pfad)) PunkteTotal.WriteLine(PunkteAktuell); } } } } |
Christian S. - Sa 19.05.12 00:19
Du musst den StreamReader schließen (close) oder der using-Klausel benutzen, sonst kann die Datei nicht überschrieben werden
interessierter - Sa 19.05.12 00:51
Jawohl, jetzt hat es geklappt :wink: Die gespeicherte Datei enthält den richtigen Wert.
Vielen herzlichen Dank.
Greets
interessierter
Th69 - Sa 19.05.12 09:03
P.S. Die
using Anweisung solltest du leserlicher schreiben (d.h. die nächste Zeile einrücken bzw. Klammern setzen):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| using(...) ...
using(...) { ... } |
Du solltest also den
StreamWriter nur einmal erstellen und dann das gesamte Schreiben innerhalb des Blocks erledigen ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!