stürzt beim einlesen ab



  • Kann das Prog ohne probleme kompilieren. Wenn ich diese Funktion aufrufe kann ich den Dateinamen auch eingeben, wenn ich allerdings RETURN drücke, stürzt das Prog ab. Finde den Fehler aber nicht.

    /************************************************************************
    * Name:     open_read                                                   *
    *                                                                       *
    * Zweck:    Öffnen einer Datei zum lesen                                *
    *                                                                       *
    * Prototyp: FILE *open_read(const char msg[], int bufsize, char fname[])*
    *                                                                       *
    * Parameter:                                                            *
    *                                                                       *
    * msg:       übergebene Zeichenkette      (E)                           *
    * bufsize:   maximal erlaubte Dateilänge  (E)                           *
    * fname:     einzulesender Dateiname      (A)                           *
    *                                                                       *
    * Funktionswert: Die korrekt eingelesene C-Quelldatei                   *
    ************************************************************************/
    FILE *open_read(const char msg[], int bufsize, char fname[])
    {
       enum{FALSE,TRUE};
       int open, i;
       char a;
       FILE *fp;
       open = TRUE;
       while (open)
       {
          printf("\nBitte Dateinamen mit Endung eingeben: ");
      	  while ((a= getchar()) != '\n')
    	     fname[i++] = a;
    	  fname[i]='\0';
    	  if (strlen(fname) > bufsize -1)
             printf("\nDateiname zu lang!");
    	  else
    	  {
    	     fp = fopen(fname,"r");
    		 if (fp != NULL)
    		 {
    		    printf("\nDatei \"%s\" konnte geoeffnet werden.", fname);
    			open = FALSE;
    		 }
    		 else
    	  	    printf("\nDatei \"%s\" konnte nicht geoeffnet werden.", fname);
    	  }
       }
    return fp;
    }
    


  • Es wär vielleicht wichtig zu wissen, was als fname übergeben wurde, aber ein Fehler ist ganz sicher, dass i nicht initialisiert ist.

    BTW:

    while ((a= getchar()) != '\n')
             fname[i++] = a;
          fname[i]='\0';
          if (strlen(fname) > bufsize -1)
             printf("\nDateiname zu lang!");
    

    Wenn der Test anschlägt, ist das Kind schon in den Brunnen gefallen.



  • Mit initialisierung geht es auch nicht. Normalerweise ist das ein Rückgabeparameter. Verstehe den Sinn dahinter auch noch nicht, sollen wir aber machen. Der Aufruf sieht so aus: fpi = open_read("Bitte Namen der C-Quelldatei eingeben", MAXNAME, fname);

    und fname ist deklariert als: char fname[MAXNAME]; und MAXNAME = 32



  • Lies bitte mein Posting nochmal.



  • Hab ihn jetzt 5 mal gelesen, weiß aber trotzdem nicht worauf du hinaus möchtest

    schon gut, es läuft

    Danke

    Edit by c.rackwitz: posts zusammengefuehrt



  • Wie hast du es denn jetzt gelöst? Hast du den Hinweis von Bashor auch beachtet (ich meine nicht die Initialisierung von i, sondern den zweiten)?



  • Nein, den 2. habe ich nun nicht beachtet.. Konnte ihn bis jetzt noch nicht finden.



  • Nackenspoiler_Joe schrieb:

    Nein, den 2. habe ich nun nicht beachtet.. Konnte ihn bis jetzt noch nicht finden.

    Worauf Bashar wohl hinauswollte war, daß du die Länge besser abfangen solltest, BEVOR du über deinen Speicher hinausschreibst.
    Du schreibst aktuell solange, wie du Daten hast und prüfst hinterher, ob das in deinen Puffer passen würde. An der Stelle hast du jedoch schon fremden Speicher überschrieben (und die Chancen stehen gut, daß dieser sogar zu deinen lokalen Variablen gehört):

    while ( ((a=getchar()) != '\n') && (i<bufsize-1) )
        fname[i++] = a;
    

Anmelden zum Antworten