Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.02.2011, 20:22

[C#] Schwierigkeiten mit StreamWriter

Hallo,
ich arbeite gerade an einem Kassenprogramm. In der Klasse CKasse habe ich eine virtuelle Funktion bool SaveProtokoll(), welche jeden Einkauf in eine Datei protokollieren soll. Jedoch habe ich ein Problem mit der Funktion StreamWriter.WriteLine(), da nur die Argumente in "" in die Datei geschrieben werden. Jedoch zeigt mir der Debugger einen korrekten Wert für die Argumente an. Jetzt frage ich mich, warum die Funktion WriteLine() nichts schreibt...
Hier die Funktion SaveProtokoll:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public virtual bool SaveProtokoll()
        {
            StreamWriter Write = new StreamWriter(ProtokollDateiName);
            try
            {
                Write.WriteLine("ProduktNummer; ProduktName; Preis;");
 
                foreach (IProdukt p in ProduktListe.Produkte)
                    Write.WriteLine(p.ID.ToString(), ";", p.Name, ";", p.Preis, ";");
 
                Write.Close();
            }
            catch (Exception)
            {
                Write.Close();
                return false;
            }
 
            return true;
        }


Ich vermute mal, dass hier kein Fehler zu erkennen ist, weshalb ich die betroffenen Dateien hochlade.

Ich hoffe ihr könnt mir weiterhelfen!

Grüße,
GreenPepper
»GreenPepper« hat folgende Datei angehängt:
  • Kasse.zip (3,56 kB - 73 mal heruntergeladen - zuletzt: 25.05.2024, 20:30)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.02.2011, 20:28

Versuchs mal so:

C#-Quelltext

1
Write.WriteLine(p.ID.ToString() + ";" + p.Name.ToString() ";" + p.Preis.ToString() + ";");

;)

Anstatt überall explizit Write.Close() aufzurufen kannst du auch einen finally Block verwenden oder überhaupt einen using Block und auf das Close() komplett verzichten:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
public virtual void SaveProtokoll()
{
  using (StreamWriter Write = new StreamWriter(ProtokollDateiName))
  {
    Write.WriteLine("ProduktNummer; ProduktName; Preis;");

    foreach (IProdukt p in ProduktListe.Produkte)
      Write.WriteLine(p.ID.ToString() + ";" + p.Name.ToString() ";" + p.Preis.ToString() + ";");
  }
}

Beiträge: 721

Wohnort: /dev/null

Beruf: Software-Entwickler/Nerd

  • Private Nachricht senden

3

01.02.2011, 20:29

Du musst den StreamWriter einmal flushen, bevor der Inhalt in die Datei geschrieben wird.

http://msdn.microsoft.com/en-us/library/…iter.flush.aspx

4

01.02.2011, 20:30

:grins: lol, ich finds nur komisch, das die Funktion als parameter params object[] hat.., da müsste der + Operator doch überflüssig sein, bzw. es müsste möglich sein meherer Argumente zu übergeben.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

01.02.2011, 20:35

Hab oben noch grad schnell was dazueditiert...
Mit dem + packst du alles in einen String zusammen und gibst dann nur diesen String an WriteLine(). Die object[] Variante dagegen verhält sich wie String.Format, d.h. erwartet als ersten Parameter einen Format String. Damit würde es dann richtig so aussehen:

C#-Quelltext

1
Write.WriteLine("{0};{1};{2};", p.ID.ToString(), p.Name, p.Preis);

6

01.02.2011, 20:39

Ah, cool danke! ich war gerade noch bei den stream-operatoren in c++....

Und das mit dem Finally-Block ist auch nicht schlecht. Wegen solchen Sachen schätze ich die Sprache höher wie c++. Sie ist einfach moderner.

Danke nochmal!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.02.2011, 20:42

Und das mit dem Finally-Block ist auch nicht schlecht. Wegen solchen Sachen schätze ich die Sprache höher wie c++. Sie ist einfach moderner.

Ich mag C# auch aber Fakt ist dass so etwas wie finally oder using Blöcke in C++ gar nicht gebraucht wird ist da C++ einem etwas viel eleganteres (RAII) bietet was in C# leider unmöglich ist ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (01.02.2011, 20:47)


8

01.02.2011, 20:47

Meinst du, dass die Daten mit dem Verlassen des Gültigkeitsbereiches gelöscht werden (durch Destruktor oder ähnlichem)? Ich hätte gedacht, dass das in C# ganz automatisch durch dem Managed-Heap geschieht? Außerdem haben C# Klassen doch auch einen Destruktor

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

01.02.2011, 20:49

Der Punkt ist aber dass es eben genau wegen dem Garbage Collector vollkommen undefiniert ist wann genau ein Objekt zerstört wird. Auch wenn das Stream Objekt in seinem Destruktor Close() aufruft kannst du dich nicht darauf verlassen dass das jemals wirklich passiert bevor dein Programm beendet wird. In C++ dagegen ist es haargenau definiert wann ein Objekt zerstört wird. C# ist trotzdem eine tolle Sprache nur eben anders und eigentlich kaum mit C++ vergleichbar.

10

01.02.2011, 20:51

Hm. Verstehe. Tja, alles hat seine Vor- und Nachteile... ;)

Werbeanzeige