Funktion zum Daten aus datei lesen



  • Hi.

    muss für mein Projekt mit Dateien arbeiten, deshalb habe ich ne Funktion geschrieben.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void datei(char dateiname[15])
    { 
    FILE * pFile;
    int lSize, buchs[1];
    char * buffer;
    
    pFile = fopen(dateiname, "rb");
    
    if(!(pFile==NULL))
    {
    printf("\n\tDatei wurde gefunden!");
    printf("\n\tDatei wurde geoeffnet!");
    
    fseek(pFile, 0, SEEK_END);
    lSize = ftell(pFile);
    
    printf("\n\n\tGroesse der Datei ( Bytes ): %i", lSize);
    
    char inhalt[lSize];
    
    rewind(pFile);
    
    buffer = (char*)malloc(lSize);
    
    if(!(buffer==NULL))
    {
    printf("\n\n\tBuffer wurde gefuellt!");
    
    fread(buffer, 1 ,lSize, pFile);
    
    printf("\n\n\tInhalt der Datei: %s\n", buffer);
    
    while(!feof(pFile))
    {
    printf("1");
    buchs[0] = fgetc(pFile);
    printf("2");
    strcat(inhalt,buchs);
    printf("3");
    }
    
    fclose(pFile);
    
    printf("String Inhalt: %s", inhalt);
    }
    
    free(buffer);
    return;
    }
    
    printf("\n\tDatei wurde nicht gefunden!");
    }
    
    int main()
    {
    pspDebugScreenInit();
    SetupCallbacks();
    
    datei("test.lvl");
    }
    

    es klappt auch alles gut, dass Programm läuft komplett durch und so, jedoch bekomme ich in Zeile 48 statt dem Inhalt eine Art + nach dem Doppelpunkt.

    Woran liegt es??

    Bin nicht so bewandert in der Arbeit mit Strings und Files, deshalb kann mir da auch irgendwo ein Anfängerfehler unterlaufen sein.

    Ich danke euch schon mal!



  • Du verwendest strcat falsch.

    strcat(inhalt,buchs);
    

    inhalt ist nicht initailisiert, also nicht Nullterminiert. Und buchst ist nichtmal ein String.



  • buchs ist doch string:

    char buchs[1];
    

    und das mit Inhalt, wie mache ich das??



  • Hi,

    ich habe mir mal deinen Code angesehen und ein paar Fehler gefunden.

    Zeile 23: Beim Ansi-C sollten Variablen am Anfang von Funktionen deklariert
    werden. Dazu kommt dann noch, dass beim Compilieren die Größe von Arrays
    bekannt sein muss. Ok, beides wird mit dem C-99 Standard obsolet.

    Zeile 42: buchs ist definiert als int [1] und nicht als ein char-Array.
    Damit kommt strcat dann nicht zurecht und der Compiler meldet eine Warning.

    Du liest die Datei aus zwei verschiedene Arten: einmal mit fread und einmal
    mit fgetc. Beim zweiten Lesen hast du vergessen mit rewind() wieder zum
    Anfang der Datei zu springen.

    Hier mal meine Verbesserungen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void datei(char dateiname[15])
    {
        FILE * pFile;
        int lSize, buchs;
        char * buffer;
    
        pFile = fopen(dateiname, "rb");
    
        if (pFile) {
            char *inhalt;
    
            printf("\n\tDatei wurde gefunden!");
            printf("\n\tDatei wurde geoeffnet!");
    
            fseek(pFile, 0, SEEK_END);
            lSize = ftell(pFile);
    
            printf("\n\n\tGroesse der Datei ( Bytes ): %i", lSize);
    
            inhalt = malloc(lSize+1);
            memset(inhalt, 0x0, lSize+1);
    
            rewind(pFile);
    
            buffer = (char*)malloc(lSize);
    
            if (buffer) {
                char *t = inhalt;
                printf("\n\n\tBuffer wurde gefuellt!");
    
                fread(buffer, 1 ,lSize, pFile);
    
                printf("\n\n\tInhalt der Datei: %s\n", buffer);
    
                rewind(pFile); /* hattest du vergessen! */
    
                while (!feof(pFile)) {
                    buchs = fgetc(pFile);
                    if (buchs != EOF) *t = (char) buchs;
                    t++;
                }
    
                fclose(pFile);
    
                printf("String Inhalt: %s", inhalt);
            }
    
            free(buffer);
            free(inhalt);
            return;
        }
    
        printf("\n\tDatei wurde nicht gefunden!\n");
    }
    
    int main()
    {
        datei("test.lvl");
    
        return 0;
    }
    

    Gruß mcr



  • deine 3 Verbeserungsvorschläge habens net behoben, aber den Script funktioniert. Werde mir das mal komplett durchlesen verstehen und dann kann ichs. Aber sowass wie deine Antwort, das habe ich absolut gebraucht, danke dafür, so hätte ich wahrscheinlich ewig davor gesessen.

    Jedoch habe ich noch eine Frage dazu.

    Ich wills ja in nem Array haben, um einzelne Werte auslesen zu können. Wie mache ich das hier. Habe mal in dem letzten printf statt inhalt inhalt[0] eingesetzt und dann gings net, hat sich aufgehängt.



  • buffer und inhalt (du liest die datei ja zweimal ein!) enthält die komplette
    Textdatei, die du einliest. Beide Arrays sind vom Typ char*. Hier wird jeder
    Buchstabe (Zeichen) in ein separates Element inhalt[i] gespeichet.

    Aus jedes Element hast du mit inhalt[i] Zugriff.

    C behandelt Arrays von chars als eine Art String. Ein printf("%s", inhalt)
    gibt den gesamten string aus, während ein printf("%c", inhalt[i]) nur das
    i-te Zeichen des Strings aus. Ein String endet mit dem Zeichen '\0'.

    Ich bin mir nicht sicher, ob du wirklich die gesamte Datei in einen String
    einlesen möchtest. Wie sieht denn deine Datei aus und was für Informationen
    brauchst du denn dann daraus?

    Gruß mcr



  • habe mein Problem jetzt gelöst 😉

    Habe mich nochmal genauer befasst mit meiner Sache, habe mir Hintergrundwissen angeeignet und bin auf diese Lösung gekommen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
    
    	FILE *level;
    	int buffer;
    	// array
    	int welt[50], size=0, i;
    	level = fopen("level_1.lvl","rb");
    	if(level) {
    		while(!feof(level)) {
    			buffer = fgetc(level)-48;
    			welt[size] =  buffer;
    			size = size+1;
    		}
    	}
    	for(i=1; i < size; i++) {
    		printf("%i", welt[i-1]);
    	}
    }
    

    ich denke mal, ihr hättet nicht so Probleme damit gehabt, aber ich für meinen Teil bin voll stolz auf mich, das ich es endlich gepackt habe 😃

    Das ding ließt die Datei level_1.lvl Formt die Werte von ASCII zu richtigen Zahlenwerten um, speichert sie in einem Array einzeln ab und gibt dann nochmal alles aus.

    Hätte net gedacht das es so einfach geht.


Anmelden zum Antworten