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

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

1

15.07.2009, 21:03

fstream Fragen

Hi
Ich hoffe ich bin hier im richtigem Forum, gehört nämlich nur indirekt zum Buch.
Ich bin gerade in Kapitel 8: fstream
Jetzt dachte ich das es bewirkt, dass wenn das Programm beendet wird der Spielstand gespeichert wird.
Das Programm das ich geschrieben habe sollte eigentlich nur beim ersten Start eine Zahl abfragen die dann gespeichert wird. Jetzt fragt er aber immer die Zahl ab.
Hier de Code:

C-/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
42
43
44
45
46
47
#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    int Zahl;
    int Zaehler;

    if (Zaehler == 0)
    {
        Zaehler++;
        cout << "Bitte eine Zahl eingeben" << endl;
        cin >> Zahl;

        ofstream Output ("Zahl.zhl", ios::binary);
    
        if (Output == NULL)
        {
            cout << "Datei konnte nicht aufgerufen werden" << endl;
                
            return 3;
        }
    
        Output.write ((char *) &Zahl, sizeof (Zahl));
        Output.close ();

    }

    ifstream Input ("Zahl.zhl", ios::binary);

    if (Input == NULL)
    {
        cout << "Datei konnte nicht gelesen werden" << endl;

        return 3;
    }

    Input.read ((char *) &Zahl, sizeof (Zahl));
    cout << "Zahl aus Datei lautet: " << Zahl << endl;
    Input.close ();

    cin.clear();
    cin.ignore();
    cin.get ();
    return 0;
}


Ist fstream dazu nicht gedacht, oder was mache ich falsch. :?

Danke im Voraus :D
Pi mal Daumen = 18.84955592

2

15.07.2009, 21:21

Hm nunja... mir stellen sich mal wieder einige Fragen bei deinem Code. Bitte nicht böse sein :-)

Warum vergleichst du die Variable "Zaehler" mit 0 obwohl du diese Zahl garnicht definierst?

Warum erhöhst du den Zaehler um 1 obwohl das Programm in keiner schleife oder sonstwas steht.

wtf is return 3?

Was willst du genau machen? Willst du erst die Datei schreiben und dann lesen oder willst du sie nur lesen. Falls letzteres der Fall ist hast du dein Ziel ja erreicht.
Wenn du Dateien schreiben willst brauchst du ofstream.
Sollte aber glaub ich in Kapitel 8 mehr als ausreichend erklärt sein.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

3

15.07.2009, 21:22

Beim ersten Programmstart ist Zaehler aber immer 0. Du musst also prüfen, ob bspw. die Datei existiert und wenn nicht, lässt du die Zahleingabe abfragen.

4

15.07.2009, 21:27

Wenn du nur beim ersten Start die Zahl abfragen möchtest, musst du erst schauen, ob die Datei schon existiert. So legst du die Datei an und bearbeitest sie sofort, egal ob sie schon existiert oder nicht.

Zudem:
ifstream Datei("Blubb", ios::binary) wird nie == NULL sein, da es kein Pointer ist.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Pseudocode:

ifstream input("Zahl.zhl", ios::binary);

if(!input.is_open())
{
    frageZahlAb();
    input.open("Zahl.zhl", ios::binary);

    if(!input.is_open())
        großerFehler();
}

//Zahl aus Input anzeigen


edit:
Zähler ist am Anfang uninitialisiert, das heißt, es besitzt irgendeinen Wert, der gerade im Speicher war. Er wird nicht über mehrere Programmstarts hinweg hochgezählt ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

15.07.2009, 22:06

Zitat von »"Fred"«

Beim ersten Programmstart ist Zaehler aber immer 0. Du musst also prüfen, ob bspw. die Datei existiert und wenn nicht, lässt du die Zahleingabe abfragen.


Nein! Das ist Compilerabhängig und kann auch in den Optionen umgestellt werden. De fakto ist es riskant. (sicher nicht für dieses einfache Programm)

6

15.07.2009, 22:17

Zitat von »"Genion"«

Zudem:
ifstream Datei("Blubb", ios::binary) wird nie == NULL sein, da es kein Pointer ist.

doch, ein input stream wird dann false, also auch ==NULL, wenn er am Dateiende angelangt ist ;)

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

7

15.07.2009, 22:18

Zitat von »"koschka"«

Zitat von »"Fred"«

Beim ersten Programmstart ist Zaehler aber immer 0. Du musst also prüfen, ob bspw. die Datei existiert und wenn nicht, lässt du die Zahleingabe abfragen.


Nein! Das ist Compilerabhängig und kann auch in den Optionen umgestellt werden. De fakto ist es riskant. (sicher nicht für dieses einfache Programm)

Und wo wird diese Variable dann zwischengespeichert? Was passiert, wenn man den PC ausschaltet etc.?
Ich habe ja was gegen Programme, die Speicher belegen, wenn sie nicht mehr am Laufen sind.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

16.07.2009, 07:15

Zitat von »"Fred"«

Zitat von »"koschka"«

Zitat von »"Fred"«

Beim ersten Programmstart ist Zaehler aber immer 0. Du musst also prüfen, ob bspw. die Datei existiert und wenn nicht, lässt du die Zahleingabe abfragen.


Nein! Das ist Compilerabhängig und kann auch in den Optionen umgestellt werden. De fakto ist es riskant. (sicher nicht für dieses einfache Programm)

Und wo wird diese Variable dann zwischengespeichert? Was passiert, wenn man den PC ausschaltet etc.?
Ich habe ja was gegen Programme, die Speicher belegen, wenn sie nicht mehr am Laufen sind.


? Wieso zwischengespeichert.

Das Betriebssystem weist einer Variablen Speicherplatz zu, der Inhalt ist dem Betriebssystem egal! Normalerweise wird die Variable dann nicht vom Inhalt anders belegt (das heist der Wert der gerade noch im Arbeitsspeicher an dieser Stelle steht, ist dann der voreingestellte Wert der Variable). Manche Compiler bieten hier Abhilfe und leeren solche Variablen. Es ist aber schneller wenn einfach jeder Programmierer aufpasst und dieses "Tool" ausstellt.

Deswegen sonnte man auch alle Zeiger mit ZeroMemory leeren, bevor man sie benutzt und für Variablen Defaultwerte setzen bevor man ihren Inhalt abruft.

Das hat rein gar nichts mit dynamischer Speicherallokierung zu tun!

Siehe: Variablen in C++

Zitat von »"Autor der Seite"«

Hier wird die Variable Einkommen gleich bei der Definition auf null gesetzt. (Ein Vorgang, der vielen Informatikern aus ihrer eigenen Erfahrungswelt sehr bekannt vorkommt.) Die Initialisierung von Variablen muss nicht zwingend durchgeführt werden. Allerdings ergeben sich viele Programmfehler daraus, dass Variablen nicht korrekt initialisiert waren. Es ist keineswegs gesichert, dass eine neu angelegte Variable den Wert 0 hat, solange Sie das nicht explizit festlegen.

9

16.07.2009, 12:07

Zitat von »"koschka"«

Deswegen sonnte man auch alle Zeiger mit ZeroMemory leeren, bevor man sie benutzt
Nein, sollte man nicht, schon gar nicht mit einer plattformabhängigen Funktion (bzw. Makro). Einen Sinn hat das Nullsetzen eines Zeigers nur, wenn dieser explizit als ungültig dargestellt werden soll und man lesend darauf zugreift. Wenn man ihn im nächsten Zug gleich überschreibt oder er den Scope verlässt, ist das unnötig.

Aber so oft sollte man in C++ eigentlich nicht mit rohen Zeigern hantieren, dass man sich deswegen dauernd Gedanken machen muss.

FLO2

Treue Seele

  • »FLO2« ist der Autor dieses Themas

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

10

16.07.2009, 14:16

Hi

Ich hab jetzt mal die Version von Genion lauffähig gebracht aber ich habe immer noch das gleiche Problem.
Ich glaube, ich habe den Code so gemacht das er falsch ist. :?

C-/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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <fstream>

using namespace std;

int FrageZahlAb ();
void GroßerFehler ();


int main ()
{
    ifstream input("Zahl.zhl", ios::binary);
    
    if(!input.is_open())
    {
        FrageZahlAb();
        input.open("Zahl.zhl", ios::binary);
    
        if(!input.is_open())
            GroßerFehler();

        
    }
    int Zahl = FrageZahlAb ();
    ifstream Input ("Zahl.zhl", ios::binary);
    Input.read ((char *) &Zahl, sizeof (Zahl));
    //Zahl aus Input anzeigen

    cout << "Zahl: " << Zahl << endl;
    Input.close();

    cin.clear();
    cin.ignore();
    cin.get();
    return 0;
}

int FrageZahlAb()
{
    int Zahl;

    cout << "Bitte Zahl eingeben" << endl;
    cin >> Zahl;

    ofstream Output ("Zahl.zhl", ios::binary);

    if (Output == NULL)
    {
        cout << "Fehler" << endl;

    }

    Output.write ((char *) &Zahl, sizeof (Zahl));

    Output.close ();
    return Zahl;
}

void GroßerFehler ()
{
    cout << "Großer Fehler" << endl;

}
    

    

Wo liegt denn der Fehler? :?

Danke im Voraus
Pi mal Daumen = 18.84955592

Werbeanzeige