Autor Beitrag
interessierter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: Do 17.05.12 18:47 
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:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: interessierter
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
  1. Neue Punktzahl vom Benutzer abfragen
  2. Dateiname vom Benutzer abfragen
  3. Mittels StreamReader alte Punktzahl aus Datei lesen (falls Datei existiert)
  4. Summe aus alter und neuer Punktzahl bilden
  5. Die Summe mittels StreamWriter in die Datei schreiben


Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: interessierter
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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:

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.05.12 23:20 
ReadLine liefert genau wie bei der Console einen String, den Du erst in einen int umwandeln musst ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: interessierter
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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:

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: interessierter
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
using(...)
    ...

// bzw. als Block
using(...)
{
    ...
}

Du solltest also den StreamWriter nur einmal erstellen und dann das gesamte Schreiben innerhalb des Blocks erledigen ;-)