Dateihandling + Strings | Ein- und Auslesen



  • Hallo,

    Ich finde meinen kleinen, Fehler nicht, der meinen Code zum Versagen bringt.

    Ich glaube es sind 2.

    1. Er liest nur das erste Wort des Strings ein 😕
    2. Er gibt selbst davon nur die ersten 3 Buchstaben aus :S

    /*
     * Autor: Marius Schuller
     *
     * Datum: 18.05.2007
     *
     * Sprache: C
     *
     * Dateiname: uebung
     *
     * Beschreibung: Uebungen: Speichert eine Datei dessen Pfad+Namen der Benutzer
     * 				 auswählt und anschließend Text hineinschreibt. Gibt diesen Text
     * 				 dann aus.
     *
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
            FILE *mein_text;
            char *string;
            char *string_t;
            char *tstring;
    
    		string = calloc(50, sizeof(char));
    		string_t = calloc(250, sizeof(char));
    		tstring = calloc(250, sizeof(char));
    
    		printf("Geben Sie einen Dateinamen INKL. Pfad an: \n");
    		scanf("%s", string);
    
            mein_text = fopen(string, "w");
    
            if(mein_text == NULL)
            {
                    printf("An error occured while opening the file! (write)\n");
                    exit(1);
            }
    
            printf("Access to the file was successfull!\n");
    
    	printf("Geben Sie ihren Text ein: (max. 250 Zeichen)\n");
    	scanf("%s", string_t);
    
            fprintf(mein_text, "%s\n", string_t);
    
            fclose(mein_text);
    
            /*Daten wieder einlesen*/
    
    		memset(tstring, '\0', sizeof(string_t)+1);
    
            mein_text = fopen(string, "r");
    
            if(mein_text == NULL)
            {
                    printf("An error occured while opening the file! (read)\n");
                    exit(1);
            }
    
    		fgets(tstring, sizeof(string_t), mein_text);
    
    		printf("%s\n", tstring);
    
            fclose(mein_text);
    
            free(string);
            free(string_t);
            free(tstring);
    
            return(0);
    }
    


  • der fehler ist, dass du die funktion scanf verwendest, die nur bis zum ersten whitespacezeichen (tab, leer, ...) einliesst. du solltest fgets verwenden auch hier verwenden und als FILE* parameter dann stdin übergeben.



  • Der zweite Fehler ist, dass du sizeof auf Zeiger anwendest, nicht auf arrays. Wenn die Zeiger 4 Byte lang sind, dann ergibt der Ausdruck sizeof(foo*) halt auch nur 4. Nicht aber die Zahl der via calloc() reservierten Bytes zurück.

    Weiteres:
    - es wäre schon sinnvoll die Rückgaben von calloc() auf NULL zu testen
    - sizeof(char) ergibt immer 1


Anmelden zum Antworten