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

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

1

26.08.2003, 01:27

Problem mit fscanf!

Hallo,


Quellcode

1
2
3
4
5
6
7
8
9
FILE* Speicher;
    Speicher=fopen("Level.txt","r");
    char* Hallo;
    fscanf(Speicher,"%s/t/n",Hallo);


    if(strcmp(Hallo,"hallo")==0){ // 0 = wahre Aussage!
        Game.Leben=10;// wenn ja Leben wir auf 10 gesetzt
    }



Diese Funktion wird genau einmal beim Start des Programmes aufgerufen, sobald es aber zur Stelle von fscanf kommt, bleibt das Programm hängen!
Ich verstehe aber leider nicht wieso, die Datei enthält wircklich das Wort Hallo(sogar eine Leerzeichen und ein Enter)! Wisst ihr was ich falsch mache?

Danke

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

2

26.08.2003, 09:14

kein Speicher reserviert

Hallo Stefan,
fscanf wird keinen Speicher selbständig reservieren, also...
char* Hallo = new char[die erwartete Länge];
und dann gehts auch mit dem...

zum Schluss delete [] Hallo.

Für diesen Zweck würde ich eine Stackvariable nehmen strHallo[1024].
Dann darf ein String max. 1023 Zeichen lang sein.
Begrenzen kannst Du die Zeile auch, damit das Programm nicht abstürzt, falls sich doch längere zusammenhängende Zeichen ergeben.
fscanf(strBuffer, "%1024s", strChars);

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

26.08.2003, 11:20

Danke für deine hilfreiche Anwort, hat bestens funktioniert! :)

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

4

26.08.2003, 19:05

Hallo,

eine Frage hätte ich noch, wenn ich die Funktion nochmals aufrufe und der Inhalt sich, in der ersten Zeile verändert hat, bemerkt das Programm leider nicht! Was muss ich noch machen, damit das Programm wieder von vorne beginnt??

Hier nochmal der Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int CMENU::Speicher_Laden()
{

    
    
    FILE* Speicher;
    Speicher=fopen("Level.txt","r");


    char strHallo[1024];
    fscanf(Speicher, "%1024s", strHallo);
    if(strcmp(strHallo,"hallo")==0){ // 0 = wahre Aussage!
        return LEVEL_1;
    }
    if(strcmp(strHallo,"servus")==0){ // 0 = wahre Aussage!
        return LEVEL_2;
    }
    
    delete [] strHallo;
    fclose(Speicher);
    
}

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

5

27.08.2003, 09:43

Achtung

nimm bitte das delete [] strHallo wech!
Das darfst Du nur machen, wenn Du einen Speicher dynamisch mit new erstellt hast.

Um auf Dateiänderungen zu reagieren, musst Du Dich mit den API-Funktionen FindFirstChangeNotification und FindNextChangeNotification beschäftigen.
Mit MsgWaitForSingleObjects oder MsgWaitForMultipleObjects wartest Du in einem Workerthread, ob es Veränderungen an Datei oder Verzeichnissen gab und kannst dementsprechende Funktionen, wie auch z. B. InitGame aufrufen.
Würde ich auf später verschieben.
Mit Multithreading beginnen erst die richtigen Probleme (zumindest am Anfang) ;-)
Bis später...

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

6

27.08.2003, 11:31

ok, danke, klingt sehr kompliziert.....

PS: aber auch sehr eigenartig, dass es beim ersten Mal das Wort findet und beim Zweitenmal nicht mehr, obwohl die Datei neugeladen wird.....

Jens

Treue Seele

Beiträge: 117

Wohnort: Dresden

  • Private Nachricht senden

7

27.08.2003, 16:09

aso warte mal...

Du meinst, dass die Funktion durch Deinen Code bereits erneut aufgerufen wird(?) und dann beim zweiten mal den Inhalt nicht mehr findet???
Das glaube ich nicht. Da hilft nur debuggen!
Dateiinhalt nachsehen, Funktion debuggen, Variableninhalt im Debugger anzeigen.
Hast Du das delete [] strHallo rausgenommen?
Bis später...

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

8

27.08.2003, 17:52

Re: aso warte mal...

Zitat von »"Jens"«

Du meinst, dass die Funktion durch Deinen Code bereits erneut aufgerufen wird(?) und dann beim zweiten mal den Inhalt nicht mehr findet???


Ja, beim zweiten mal liefert die Funktion den Wert 0 zurück! delete [] strHallo habe ich ebenfalls herausgenommen! Schließe ich das Programm und öffne es erneuert, wird wieder der richtige Wert bem ersten mal Ausführen zurückgeliefert, beim zweiten mal wieder 0.....

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

9

27.08.2003, 18:07

Sorry, Du hattes Recht, es liegt wircklich nicht an der Funktion...
Der Fehler passiert sobald sich der Name in der txtDatei während das Programm läuft ändert! Dann liefert die Funktion einen falschen Wert zurück, sonst nicht!

Hier die Funktion, wo sich der Name in der txtDatei ändert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void CMENU::Speicher_Neu(int Level)
{
    FILE* Speicher;
    Speicher=fopen("Level.txt","w");
    switch(Level)
    {
    case LEVEL_1:
        fprintf(Speicher, "hallo");
        break;

    case LEVEL_2:
        fprintf(Speicher, "servus");
        break;
        
    case LEVEL_3:
        fprintf(Speicher, "unique");
        break;

    fclose(Speicher);// vor der Klammer....argh....


    }
}



Edit: Hab den Fehler eben beim posten gesehen, wircklich ärgerlich......kommentiert

Werbeanzeige