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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

07.12.2011, 05:57

c++ I/O File

Hey,
ich habe mir mal eine kleine Konsolenanwendung für meine Tilemap geschrieben.
Doch leider kriege ich anscheinend nur Adressen anstatt Zahlen raus, woran könnte das liegen?.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Map_erstellen (int Map_Level[10][10])
{
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            Map_Level[x][y] = 1;
        }
    }

    ofstream Map_File_In ("Map_Datei/Map.txt");
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            Map_File_In.write((char *)(&Map_Level[x][y]), sizeof(Map_Level[10][10]));
        }
    }
    Map_File_In.close();
}



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Map_anschauen (int Map_Level[10][10])
{
    ifstream Map_File_Out ("Map_Datei/Map.txt");
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            cout << Map_File_Out.read((char *)(&Map_Level[x][y]), sizeof(Map_Level[10][10]));
        }
        cout << endl;
    }
    Map_File_Out.close();

    system ("pause");
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.12.2011, 06:46

Also zunächst mal vestehe ich nicht ganz wieso Du 10 mal 10 mal die komplette Map abspeicherst. Dazu kommen dann noch diverse Speicher-Überläufe, denn in das Feld an der Stelle Map[9][9] eine Map der Größe [10][10] schreiben zu wollen passt nicht ganz da rein ;) Die sizeof()-Angabe würde ich an Deiner Stelle also noch einmal überdenken.
Auch solltest Du in Deinem Code vielleicht besser einen C++ Cast nehmen und keinen C-Cast.
Als letztes würde ich Dir empfehlen doch einfach den Stream-Operator zu nutzen:
Map_File_In << Map_Level[x][y];
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (07.12.2011, 06:52)


3

07.12.2011, 07:53

Sream-Operator ist ein gutes Stichwort. So könntest du auch gleich eine eigene Klasse für deine Map entwickeln und für diese die globalen Operatoren << und >> überladen. So ließe sich deine Map in jeden beliebigen (Zeichen)Strom schreiben (cout, ofstream, stringstream, ...) und lesen (cin, ifstream, stringstream, ...). Du könnest auch Standard-Container verwenden statt Arrays ;o).

Die Namen der Bezeichner sollten auch einer gewissen Konvention folgen.

Eingebürgert hat sich z. B.:

- Klassennamen beginnen mit einem Großbuchstaben wWer ist eigentlich auf diese "C"-Präfix gekommen?).
- Funktionsnamen mit einem Kleinbuchstaben (üblicherweise mit einem Verb).
- Objekte beginnen ebenfalls klein.
- Um einzelne Wörter im Bezeichner hervorzuheben hat sich CamelCase etabliert.

So können sich Dritte schneller in deinen Code reindenken (und du selbst irgendwann auch).

Grüße ...

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

4

07.12.2011, 10:12

Ja danke ehm das mit dem C steht im Buch c++ für Spieleprogrammierer und wenn ich micht jetzt nicht täuschte auch in 3D Spiele Programmierer


EDIT:
Die daten speichert er jetzt in meiner txt aber das Lesen geht irgendwie nicht ich habe mal Tante Google angeschmissen aber ich finde nur i/o für stings oder char.

Ich poste lieber nochmal wie ich es jetzt habe um Missverständnisse aus dem Weg zu gehen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Map_erstellen (int Map_Level[10][10])
{
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            Map_Level[x][y] = 1;
        }
    }

    ofstream Map_File_In ("Map_Datei/Map.txt");
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            Map_File_In << Map_Level[x][y];
        }
    }
    Map_File_In.close();
}



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Map_editor (int Map_Level[10][10])
{
    ifstream Map_File_Out ("Map_Datei/Map.txt");
    for (int y=0; y<10; y++)
    {
        for (int x=0; x<10; x++)
        {
            cout << Map_File_Out.read ((char*) &Map_Level[x][y], sizeof (Map_File_Out));
        }
        cout << endl;
    }
    Map_File_Out.close();

    system ("pause");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Raidenkk« (07.12.2011, 10:54)


Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

07.12.2011, 15:34

Nunja schau dir doch mal deine txt datei an und sag mir woran du erkennst wieviele Zahlen da stehen bzw. woran deine Methode zum Einlesen das erkennen soll. Möchtest du deine Map denn als "lesbare" Textdatei schreiben oder willst du es als eine Art Speichern/Laden Variante nutzen? Denn dann würde sich die binäre Speicherung und Auslesung empfehlen. Der Unterschied ist, dass bei einer Speicherung als Text der Inhalt der Variabeln in einen Text umgewandelt und dieser dann in die Datei geschrieben wird. Das für dazu, dass aus "int a = 12425;" zunächst ein "12425" string wirdwelcher die Größe von 5*sizeof(char)=5 byte aufweist, während ein binär gespeicherter int nur 4 byte groß ist.
EDIT: achso auf binär stellt man per std::fstream(dateiname, std::ios::out | std::ios::binary) bzw std::fstream(dateiname, std::ios::in | std::ios::binary). Allerdings funktioniert für binäre Dateien die << und >> Operatoren oft nicht so wie erwartet (es wird halt weiterhin zunächst in ein string umgewandelt).
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.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

07.12.2011, 16:33

Allerdings funktioniert für binäre Dateien die << und >> Operatoren oft nicht so wie erwartet (es wird halt weiterhin zunächst in ein string umgewandelt).

Seit wann das denn? Die übertragen ganz brav die binären Werte. Mir ist da noch nie eine String-Umwandlung bei untergekommen. Erklär mal genauer, was Du meinst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

07.12.2011, 20:25

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <fstream>
int main(int argc, char* argv[])
{
    char filename[2048];

    std::fstream test("hi.blubber", std::ios::out|std::ios::binary);
    test << 12242;
    test.close();
    return 0;
}

Also ich sehe da keinen Fehler und der VS2008 erstellt mir daraus eine 5 byte Datei mit 31 32 32 34 32 als Hexcodeinhalt.
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.

8

07.12.2011, 21:07

Wobei dokumentiert ist, dass die shift-Operatoren der formatierten Ein- bzw. Ausgabe dienen. Der <<-Operator in deinem Beispiel verhält sich somit erwartungsgemäß: Erst wird formatiert, dann geschrieben.



Wenn man pure Bytes jonglieren möchte, sollte man daher auf read und write setzen.



Grüße ...

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

07.12.2011, 21:12

Man, man, man, C++ is wohl doch zu lange her mittlerweile. :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

07.12.2011, 21:56

Naja...für die Fälle habe ich mir ein Serializer geschrieben ala

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct serializer
{
    std::fstream            str;

    template<class T> serializer& operator << (const T &in)
    {
        str.write((char*)&in,sizeof(in));
        return *this;
    }

    template<class T> serializer& operator >> (T &out)
    {
        str.read((char*)&out,sizeof(out));
        return *this;
    }

Aber im Endeffekt sind das ja auch nur verkappte read/write Aufrufe, daher sollte man sich ruhig mal mit den Grundlagen auseinandersetzen.
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.

Werbeanzeige