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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

21

08.02.2012, 21:58

filename.good() wird ja nur false, wenn irgendwo ein Fehler-Flag auftritt?
Aber was hat das ganze mit dem atoi zu tun? Weil true heißt doch, dass kein Fehler aufgetreten ist, und drum müsste es doch gehen?^^

Worums mir geht: Du sagst mit >> und einem unsigned int geht es nicht. Das kann aber eigentlich nur irgendwie daran liegen wie du das Einlesen versuchst, denn normalerweise müsste es gehen. Evtl. versuchst du eben mal einen int zu lesen wo kein int in der Datei steht. Wenn du das machst, dann wird fail() true. Oder vielleicht sind die Zahlen in deiner Datei negativ?

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

22

09.02.2012, 19:00

Ich will in Control.ctrl die Steuerung speichern und das "number" im Code ist dann die Anzahl der Leerzeichen
Also der Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ifstream filename;
    filename.open("Saves/Control.ctrl", ios::in);

    if(filename)
    {
        string info;
        int counter = 0;
        while(!filename.eof())
        {
            filename>>info;
            counter++;
            if(counter == number)
            {
              //Hier dann entweder einem string (in meinem Fall den Namen der Taste) zuweißen mit string_von_taste = info;
              //Oder eben einer unsigned int Variable (in meinem Fall später für den sf::Key::Code) auch mit unsigned_int_von_taste = info;
            }


Und das ist der Inhalt von Control.ctrl:

Left 291
Right 292
Up 293
Down 294
Space 277
Escape 256

Man erkennt schön den Namen der Taste und daneben den sf::Key::Code
Habs vorher mit Control.txt probiert, hat aber weder noch funktioniert ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

09.02.2012, 19:04

Wie wärs damit:

C-/C++-Quelltext

1
2
3
4
5
6
std::string cmd;
int keycode;
while (file >> cmd >> keycode)
{
  ...
}

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

24

09.02.2012, 19:04

@dot:
Ich hab mich auch schon gewundert warum es nicht geht, weil es gibt ja auch keine negativen Zahlen und wenns ein string wär müsste es doch zumindest eine 0 speichern, tut es aber nicht... Vielleicht ist ja an meinem Code was falsch ;) Wenn ja wunderts mich aber, dass es mit atoi() ohne Probleme funktioniert^^

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

25

09.02.2012, 19:07

Zitat

while (file >> cmd >> keycode)
Wenn ich das so mache, erkennt der >> Operator ob file ein integer oder ein string ist und quetscht es dann nur dort hinein?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

09.02.2012, 19:13

Wenn du es so machst, sagst du dass er immer erst einen string in cmd gefolgt von einem int in keycode lesen soll. Und zwar so lange bis die Datei aus is oder ein Fehler auftritt. Wenn in der Datei mal zwei strings hintereinander kommen würden, gäbe es z.B. einen Fehler (file.fail()).

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

27

09.02.2012, 19:26

Ah danke gut zu wissen ;) Ist mal wieder was praktisches ;)
Aber leider funktionierts nicht, wie es eigentlich funktionieren soll und ich glaub ich weiß auch warum...
Also ich habs jetzt so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if(file)
    {
        string info_string;
        unsigned int info_int;
        int counter = 0;
        while(file>>info_string>>info_int)
        {
            counter++;
            if(counter== number)


Ich denk mal dass bei der while-Schleife logischerweise sofort beide Werte gesetzt werden, ich aber den counter nur 1 mal hochzählen lasse und das dann natürlich nicht funktionieren kann ;)
Wenn ich den counter um 2 erhöhe überspring ich ja 1 mal einen Wert und dann gehts auch wieder nicht...^^

Ist atoi so schlimm? Bin froh, dass es wenigstens so funktioniert^^
Aber warum file>>unsigned int nicht geht versteh ich immer noch nicht... ist doch dasselbe wie file>>string und dann atoi(string.c_str()) ?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

09.02.2012, 19:30

Wofür genau brauchst du diesen counter?
atoi() ist C. Erst einen string einzulesen und ihn dann umzuwandeln ist außerdem eben nicht das selbe wie direkt eine Zahl einzulesen ;)

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

29

09.02.2012, 19:33

Ich hab das Laden in eine Extra Funktion gepackt mit dem Parameter Number, damit ich alles Laden kann.
Und den counter verwend ich eben, damit ich eben nur (je nachdem was ich brauch) das Stück bis zum nächsten Leerzeichen dem Wert zuweisen kann

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

09.02.2012, 19:41

Bin mir nicht ganz sicher was du damit meinst. Aber ich vermute mal es geht dir darum, dass du die Steuerungsconfig zusammen mit anderen Dingen in einer Datei haben willst und das Auslesen der Steuerung in einer eigenen Funktion!?
Das ist auch sehr gut dass du das so machen willst. Ich würde dann aber vorschlagen, dass du nicht in jeder Funktion die Datei neu öffnest und die irrelevanten Teile überspringst, sondern dass du dir eine große Funktion schreibst die sich generell um das Lesen der Config kümmert, die Datei öffnet und dann einfach nurmehr einen std::istream& an die jeweiligen Subfunktionen übergibt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void readOtherConfig(std::istream& file)
{
  ...
}

void readControls(std::istream& file)
{
  ...
}

void readConfig(const char* filename)
{
  std::ifstream file(filename);

  if (!file)
    return;

  readOtherConfig(file);
  readControls(file);
}

Werbeanzeige