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

21

21.01.2011, 00:27

Nja so wie bei einer normalen Funktion auch? Der Funktionsname steht in der Funktionssignatur ;)

C-/C++-Quelltext

1
std::ofstream& write_binary(_T const& data, std::ofstream& out)

=>
Rückgabetyp: std::ofstream-Referenz
Funktionsname: write_binary
Argumente:
- konstante Referenz unseres Typens
- Referenz eines std::ofstreams
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

22

21.01.2011, 17:06

OK, hatte ich gar nicht gesehn ^^.
Danke!

m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

23

21.01.2011, 17:22

Da fällt mir gerade auf, es geht bei mir doch nicht, die Methode sort rufe ich gar nicht auf, die habe ich nur auskommentiert, ....
ich habe mir was eigenes geschrieben, das funktioniert wenigstens!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

24

23.01.2011, 13:02

Utility.hpp

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
#ifndef UTILITY_HPP__INCLUDED
#define UTILITY_HPP__INCLUDED

#pragma once

namespace util
{
    template <typename _T> 
    std::ofstream& write_binary(_T const& data, std::ofstream& out) 
    { return out.write(reinterpret_cast<const char*>(&data), sizeof (_T)), out; }

    template <> 
    std::ofstream& write_binary(std::string const& data, std::ostream& out)
    {
        const std::size_t length(data.length() + 1); 
        out.write(reinterpret_cast<const char*>(&size), sizeof (std::size_t));
        out.write(data.c_str(), length);
        retern out;
    }

    template <typename _T>
    std::istream& read_binary(_T& data, std::istream& in) 
    { return in.read(reinterpret_cast<char*>(&data), sizeof (_T)), in; }

    template <>
    std::istream& read_binary(std::string& data, std::istream& in) 
    {
        std::size_t length(0);
        in.read(reinterpret_cast<char*>(length), sizeof (std::size_t));
        char* temp(new char[length]);
        in.read(temp, length);
        data = temp;
        delete [] temp;
        return in;
    }
} // util

#endif // UTILITY_HPP__INCLUDED 


Score.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef SCORE_HPP__INCLUDED
#define SCORE_HPP__INCLUDED

#pragma once

struct Score
{
    Score(std::string const& name = "", const long points = 0, std::string const& date = "")
        : name(name), points(points), date(date)
    {}

    std::string name;
    long points;
    std::string date;
};

#endif // SCORE_HPP__INCLUDED


Highscore.cpp

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
#include <vector>
#include <fstream>
#include "Utility.hpp"
#include "Score.hpp"

void Highscore::load()
{
    std::ifstream file_stream("Highscore.bin", std::ios_base::binary);
    if (!file_stream) throw std::runtime_exception("no resources access");

    while (file_stream)
    {
        Score temp;
        util::read_binary(temp.name, in);
        util::read_binary(temp.points, in);
        util::read_binary(temp.date, in);
        m_scores.push_back(temp);
    }
}

void Highscore::save() const
{
    std::ofstream file_stream("Highscore.bin", std::ios_base::binary);
    if (!file_stream) throw std::runtime_exception("no resources access");
 
    for (std::vector<std::string>::const_iterator it(scores.begin()), end(scores.end()); it != end; ++it)
    {
        util::write_binary(it->name, file_stream);
        util::write_binary(it->points, file_stream);
        util::write_binary(it->date, file_stream);
    }
}



;) Wo war da jetzt dein Problem?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

25

23.01.2011, 14:29

Erstmal danke ich dir, für diesen Code, aber er enthält einige Schreibfehler, ich hoffe du weißt das,

Verstehe mich bitte nicht falsch, aber ich bin verdammt verärgert, dass du mir hier einfach einen Code postest, ohne dass ich ihn selbst erstellt habe,
und ihn einfach so verwenden soll.

Auf jeden Fall, ich möchte immer, wenn ich um Hilfe bitte, wissen was an meinem Code denn falsch ist, und nicht eine fertige lösung bekommen, verstehe mich bitte.

Ich werde hier mal meinen Code posten, und will wissen warum dieser nicht binär in Dateien schreibt :

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
66
67
68
69
70
71
72
73
74
75
76
77
void Highscores::loadHighscores()
{
    struct stat stFileInfo;
    if(0==stat("Highscores.bin",&stFileInfo))
    {
    //  Datei auslesen
        ifstream data ("Highscores.bin", ios::in | ios::binary);

        data.seekg (0, ios::end);
        int length = data.tellg();
        data.seekg (0, ios::beg);

        char* text = new char[length];
        data.read(text,length);

        data.close();

    //  Daten verarbeiten
        string sToken;
        vector<string> tokens;
        for(int i = 0;i<length;i++)
        {
            if(text[i]=='\n')
            {
                tokens.push_back(sToken);
                sToken = "";
            }
            else
            {
                sToken = sToken + text[i];
            }
        }

        int profiles = atoi(tokens[0].c_str());
        int token = 1;
        long points;
        string name,date;
        Score s;

        for(int i = 0;i<profiles;i++)
        {
            name =  tokens[token];
            token++;
            points = atoi(tokens[token].c_str());
            token++;
            date =  tokens[token];
            token++;

            s.name = name;
            s.points = points;
            s.date = date;

            scores.push_back(s);
        }
        delete[] text;
    }
}

void Highscores::saveHighscores()
{
    ofstream data ("Highscores.bin", ios::out | ios::binary);

    int scoresSize = scores.size();
    save(data,toString(scoresSize)+"\n");    // Anzahl der Profile speichern
    for(int i = 0;i<scoresSize;i++)
    {
        save(data,scores[i].name+"\n");  // Name speichern
        save(data,toString(scores[i].points)+"\n");  // Punkte speichern
        save(data,scores[i].date+"\n");  // Datum speichern
    }
    data.close();
}

void Highscores::save(std::ofstream &data, std::string content)
{
    data.write(content.c_str(),content.size()*sizeof(char));
}


Mein Programm funktioniert super, nur dass er nicht binär schreibt, obwohl ich binary flags verwende, das verwundert mich wirklich,

Meine momentane Laune :
Teilweise : :cursing:
und Teilweise : :(
sowie : :thumbsup:

Danke wenn du mir das beantworten könntest, m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

26

23.01.2011, 14:36

Mein Programm funktioniert super, nur dass er nicht binär schreibt, obwohl ich binary flags verwende, das verwundert mich wirklich


Ok ich glaub du und wir haben eine andere vorstellung von "Binär"
Was verstehst du unter Binär?

Der einzige Unterschied zwischen Text- und Binärdateien ist die handhabung von Zeilenumbrüchen. Das wars dann aber auch schon.

Ich denk mal du verstehst unter Binär den Zeichensalat den du zum Beispiel siehst, wenn du eine Bilddatei in einem Texteditor öffnest, oder?

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

27

23.01.2011, 14:49

Genau, unter binär verstehe ich, dass man den nicht willkürlich im Texteditor ändern kann, das verstehe ich darunter!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

28

23.01.2011, 14:56

Nun du schreibst aber nunmal alles als string darein, also stehts auch als string dadrin.

Um zum Beispiel einen integer als integer in die Datei zu schreiben:

C-/C++-Quelltext

1
2
int scoresSize = scores.size();
data.write( scoreSize, sizeof(int) );


Und nicht vorher den integer in einen string convertieren.

Aber natürlich kann man auch das per Hand in der Datei verändern.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

29

23.01.2011, 15:02

Gut dann lasse ich alles so wie es ist, denn wenn man es dann auch noch verändern kann, mache ich mir erst gar nicht die mühe,
ich habe schon genug Tage damit verschwendet X(
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

30

27.01.2011, 15:51

man kann es immer verändern.

Du könntest es verschlüsseln oder Prüfsummen, Prüf-Hashes und ähnliches einbauen um bei der Programmausführung zu überprüfen ob Änderungen gemacht worden sind.

Da stellt sich die Frage wieviel Sicherheit Du da brauchst und wieviel Aufwand du entsprechend reinstecken möchtest.

Werbeanzeige