problem: textdatei in unsized string array speichern



  • Willst du unbeding mit fgetc arbeiten? Wieso nicht Zeilenweise mit fgets?



  • muss ich. die datei ist verschlüsselt, und muss beim auslesen noch entschlüsselt werden, was am besten mit fgetc funktioniert.
    weiteres problem: mit malloc und realloc kenne ich mich nicht aus...



  • man: malloc(3)
    man: realloc(3)

    es ist einfach zu benutzen, aber man muss gut aufpassen, dass die Zeiger nicht verloren gehen, sonst hat man am Ende nur Speicherlecks.



  • sh*t, ich kapiere das einfach nicht.
    kann ich nicht einfach zu beginn sagen wir 8 kB speicher deklarieren und dann damit arbeiten?



  • Achtung, hab das so geschrieben, nicht kompiliert, sollte aber funktionieren. Sorry falls irgendwo Syntax-Error. Es ist nicht die beste Lösung, aber sie sollte gehen. Kannst den Code ja anppassen.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char **argv) {
        FILE *fp;
        int c;
        size_t counter = 0;
        char *str = (char*)malloc(sizeof(char)),
             file_path[] = "in.txt";
    
        if ((fp = fopen (file_path, "r")) == NULL) {
            fprintf(stdout, "Fehler beim Oeffnen der Datei %s\n", file_path);
            return 1;
        }
    
        while ((c = fgetc(fp)) != EOF) {
            ++counter;
            str = (char*)realloc(str, sizeof(char) * (counter));
            *(str + counter-1) = c;
        }
        printf("%s", str);
    
        if ( fclose (fp) != 0) {
            fprintf(stdout, "\nFehler beim Schliessen der Datei %s\n", file_path);
            return 1;
        }
        free(str);
        return 0;
    }
    


  • loki1985 schrieb:

    sh*t, ich kapiere das einfach nicht.
    kann ich nicht einfach zu beginn sagen wir 8 kB speicher deklarieren und dann damit arbeiten?

    du kannst, aber wenn du etwas einliest, was größer als 8 KB ist, wirst du Probleme haben.

    Also hier ein Beispiel für mallco und realloc

    /* malloc realloc Beispiel */
    #include <stdio.h>
    #include <stdlib.h>
    
    void print_int_array(const int* arr, size_t len)
    {       
        size_t i;
        printf("{");
        for(i=0; i<len-1; ++i)
          printf("%d, ", arr[i]);
        if (len) printf("%d}\n", arr[len-1]);
    
    }   
    
    int main()
    {   
        int* arr;
        int anzahl=0, neue_anzahl=0, eingabe, i;
    
        printf("Wie viele Zahlen willst du? ");
        scanf("%d", &anzahl);
    
        if (!anzahl  || 0>anzahl)
        {
            fprintf(stderr, "Gib eine Zahl größer 0\n");
            return 1;
        }
    
        /* Speicher reservieren. Ich will "anzhal" neue
           Felder von Typ int, deshalb sizeof(int)*anzahl */
        arr = (int*) malloc(sizeof(int)*anzahl);
    
        if(!arr)
        {
            fprintf(stderr, "Speicher kann nicht reserviert werden");
            return 1;
        }
    
        for(i=0; i<anzahl; ++i)
        {
            printf("%d. Zahl: ", i+1);
            scanf("%d", &eingabe);
            arr[i]=eingabe;
        }
    
        printf("Arr = ");
        print_int_array(arr, anzahl);
    
        printf("Wie viele Zahlen willst du hinzufügen? ");
        scanf("%d", &neue_anzahl);
    
        if (!neue_anzahl  || 0>neue_anzahl)
        {
            fprintf(stderr, "Gib eine Zahl größer 0\n");
            free(arr);
            return 1;
        }
    
        realloc(arr, sizeof(int)*(anzahl+neue_anzahl));
        for(i=0; i<neue_anzahl; ++i)
        {
            printf("%d. Zahl: ", i+anzahl+1);
            scanf("%d", &eingabe);
            arr[i+anzahl]=eingabe;
        }
    
        printf("Arr = ");
        print_int_array(arr, anzahl+neue_anzahl);
    
        /* Speicher wieder freigeben */
        free(arr);
    
        return 0;
    }
    


  • GPC schrieb:

    Achtung, hab das so geschrieben, nicht kompiliert, sollte aber funktionieren. Sorry falls irgendwo Syntax-Error. Es ist nicht die beste Lösung, aber sie sollte gehen. Kannst den Code ja anppassen.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main (int argc, char **argv) {
        FILE *fp;
        int c;
        size_t counter = 0;
        char *str = (char*)malloc(sizeof(char)),
             file_path[] = "in.txt";
    
        if ((fp = fopen (file_path, "r")) == NULL) {
            fprintf(stdout, "Fehler beim Oeffnen der Datei %s\n", file_path);
            return 1;
        }
    
        while ((c = fgetc(fp)) != EOF) {
            ++counter;
            str = (char*)realloc(str, sizeof(char) * (counter));
            *(str + counter-1) = c;
        }
        printf("%s", str);
    
        if ( fclose (fp) != 0) {
            fprintf(stdout, "\nFehler beim Schliessen der Datei %s\n", file_path);
            return 1;
        }
        free(str);
        return 0;
    }
    

    danke. das funktioniert ganz gut. nur kann ich hier (scheinbar) nicht eine einzelne zeile abrufen [printf("%s", str[zeilennummer]);]
    wenn ich das versuche stürzt es ab...

    @supertux: werde mir das mal ansehen. malloc und co scheinen ja öfter gebraucht zu werden.



  • Darauf ist es auch noch nicht ausgelegt, prüf einfach ab ob's ein '\n' ist.



  • Deine str Varible ist auch kein 0-terminierends String!



  • so, habe es endlich geschafft. habe es umgeschrieben dass malloc jedesmal wenn ein neuer array-member beschrieben werden sollte den erstmal auf eine bestimmte speichergrösse bringt.

    thanx für die hilfe!

    ---loki


Anmelden zum Antworten