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

Anonymous

unregistriert

1

23.12.2005, 14:36

Frage zu "Datei schreiben / Datei lesen"

Hallo zusammen..

Ich habe ein Problem: Ich möchte ein Array merhmals in eine Datei speichern da dieser während der Laufzeit seinen Wert ändert. Ich mache das folgendermassen:

C-/C++-Quelltext

1
2
3
4
            for (int z=0;z<30;z++)
            {
                Solution.write((char*) &Place[z].Bus, sizeof (Place[z].Bus));
            }

(Natürlich öffne ich die Datei zuerst mit ofstream Solution und schliesse sie am Schluss wieder. Das Array "Place" hat 30 Stellen.)
Wie kann ich danach das ganze wieder auslesen? Der Array-Name mit dem Index genügt ja nicht mehr, da ich ihn mehrere Male in die Datei geschrieben habe.

Dann habe ich noch ein Problem: Wie kann ich die Daten speichern, damit ich die Datei danach öffnen kann und den Inhalt auch verstehe, denn jetzt werden nur sehr seltsame Zeichen angezeigt! Oder kann ich mit einen speziellen Programm auch diese Dateien öffnen?

MfG klickklack

ähM_key

Frischling

Beiträge: 49

Beruf: Schüler

  • Private Nachricht senden

2

23.12.2005, 16:52

Zitat

Wie kann ich danach das ganze wieder auslesen? Der Array-Name mit dem Index genügt ja nicht mehr, da ich ihn mehrere Male in die Datei geschrieben habe.


So dass jedes Element des Arrays wieder an der richtigen Stelle steht?
Wie wärs mit ifstream und einer Schleife?
--
www.aqualocity.de

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

23.12.2005, 17:04

Wegen den Zeichen: du darfst es nicht als binär datei öffnen sondern als text
zum Einlesen: gibt es viele weg, aber am einfachsten ist sowas

C-/C++-Quelltext

1
while(file.read(string, sizeof(string)))
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

4

23.12.2005, 17:26

Hier vielleicht noch eine bessere Erklärung des Problems:

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
class CPlace
{
public:
    unsigned int Faehnchen;
    unsigned int Sprinter;
    void SetFaehnchen(int k);
    void Reset(int k);
};

Cplace Place[30];

    int i[30];
    int Faehnchen=0;
    int Solutions=0;

    //Datei Solution öffnen

    ofstream Solution ("Solution.sl",ios::binary);

    for(i[1]=0;i[1]<2;i[1]++)
    {
        Place[1].Sprinter=i[1];
        Faehnchen+=Place[1].Faehnchen;
        if(Faehnchen>35)
            {Faehnchen=0; break;}

    for(i[2]=0;i[2]<2;i[2]++)
    {
        Place[2].Sprinter=i[2];
        Faehnchen+=Place[2].Faehnchen;
        if(Faehnchen>35)
            {Faehnchen=0; break;}

    for(i[3]=0;i[3]<2;i[3]++)
    {
        Place[3].Sprinter=i[3];
        Faehnchen+=Place[3].Faehnchen;
        if(Faehnchen>35)
            {Faehnchen=0; break;}

// Hier stehen weitere for Schleifen bis 28..


    for(i[29]=0;i[29]<2;i[29]++)
    {

        Place[29].Sprinter=i[29];
        Faehnchen+=Place[29].Faehnchen;
        if ((Faehnchen>35) || (Faehnchen<20))
            {Faehnchen=0;break;}
        else
        {
            Solutions++;
            for (int z=0;z<30;z++)
            {
                Solution.write((char*) &Place[z].Sprinter, sizeof (Place[z].Sprinter));
            }
        }}}}}
    
    
    cout<<Solutions<<" Loesungen gefunden!"<<endl;

    //Dateien schliessen

    Solution.close();


Ein Ausschnitt aus einer Aufgabe: Es gibt 2 Sprinter, die Fähnchen abholen müssen. An 29 Plätzen sind Fähnchen aufgestellt, der Platz 0 ist der Start und das Ziel. Beide können maximal 35 Fähnchen tragen, insgesamt gibt es 55 Fähnchen (auf die 29 Plätze verteilt.) Ich hab mir nun gedacht ich suche alle möglichen Aufteilungen der Plätze zwischen den 2 Sprintern bei denen kein Sprinter mehr als 35 Fähnchen kriegt. Dann suche ich die tiefste Zeit raus und hab die Lösung :) Nun wollte ich diese Möglichkeiten alle in eine Datei "Solution.sl" abspeichern.

Eine Möglichkeit wird auf Place[30] gelegt, in die Datei gespeichert, und dann wird Place[30] mit der nächsten Möglichkeit überschrieben, in die Datei gespeichert, mit der nächsten... und so weiter. Bis alle Möglichkeiten in der Datei gespeichert sind. Doch wie kann ich nun diese Möglichkeiten wieder auslesen? Place[x] reicht nicht, da alle Möglichkeiten mit Place[x] gespeichert wurden.. Oder doch? Wie kann ich nun dem Compiler sagen dass ich die erste/zweite/zwölfte etc. Möglichkeit lesen will?

Noch zur Info: Place[x].Sprinter wird definiert mit 1 oder 0 (je nach dem ob Sprinter 1 dorthin gehen soll oder nicht). Place[x].Faehnchen sind alle definiert mit der jeweiligen Anzahl Fähnchen.

MfG klickklack

Werbeanzeige