Probleme mit fgets(...)



  • bool Liste::LoadFiles(void)
    {
    	HANDLE fHandle; 
    	WIN32_FIND_DATA wfd; 
    
    	fHandle=FindFirstFile("C:\\MeinPfad\\*",&wfd); 
    
    	do 
    	{ 
    
    	   if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
    	   { 
    	      if (strstr(wfd.cFileName,".txt")) 
    		  { 
    			  FILE *Datei;
    			  Datei = fopen(wfd.cFileName,"r");
    			  char Puffer[100];
    			  char cID[100];
    			  fgets(Puffer,100,Datei);
    			  strcpy(cID,Puffer);
    			  /*if(Puffer[1] != '0')
    			  {
    				  if(Kopf == 0)
    				  {
    					  Kopf = new Pic;
    					  Ende = Kopf;
    	    			  Kopf->SetID(StrToInt(cID));
    				  }
    				  else
    				  {
    					  Pic *p = Ende;
    				      p->SetNachfolger(new Pic);
                          Ende = p->GetNachfolger();
                          Ende->SetVorgaenger(p);
    				      Ende->SetID(StrToInt(cID));
    				  }
    			  }*/
    			  fclose(Datei);
    		  }
    	   } 
    	}
    	while (FindNextFile(fHandle,&wfd)); 
    	FindClose(fHandle);
    	return true;
    }
    

    Was ich habe:
    Einen Ordner voller Textdateien,die in der ersten Zeile [IrgendeineZahl] zu stehen haben,wie zb [22] oder [34].

    Was ich möchte:
    Zu jeder Textdatei in diesem Ordner ein Objekt erstellen, welche jeder eine andere ID haben.
    Die ID's werden aus den Textdateien rausgelesen.

    Das Problem:
    Immer wenn ich das Programm starte,kommt die Fehlermeldung:

    Debug Assertion Failed!

    Program: Pfad vom Programm
    File: fgets.c
    Line: 60

    Expression str != NULL

    Abbrechen | Wiederholen | Ignorieren

    Ich hab in dem Quelltext mit /* */ rausgefiltert,wo der Fehler sicher nicht liegt.



  • Das bedeutet, dass an die Funktion fgets ein FILE-Pointer mit dem Wert NULL übergeben wurde. In Deinem Fall ist wahrscheinlich das fopen schiefgegangen. Du solltest nach dem fopen den Returnwert (hier 'Datei') auf NULL abfragen.

    Empfehlung std::ifstream benutzen

    std::ifstream datei( dateiname );
      int id;
      if( datei >> id )
          // 'id' korrekt gelesen
    

    Gruß
    Werner



  • Das ist sehr eigenartig.

    Der Fehler muss wirklich bei fopen passiert sein.

    Aber ich verstehe nicht,was da falsch ist.

    Ist in wfd.cFileName nur der Dateiname gespeichert oder ist da der ganze Pfad?

    EDIT:Ich habs getestet.
    Der Fehler lag wirklich daran,dass ich dachte wfd.cFileName würde den ganzen Pfad beinhalten und darum hat fopen nicht gefunzt.


Anmelden zum Antworten