Textdateien einlesen, Werte darstellen und Berechnung ausführen



  • Hallo,
    vorab mal kurz mein Code mit dem ich Probleme habe.

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    
    #define MAX_ZEILEN 100
    #define MAX_LAENGE 100
    
    int Eingabe(const char* dateiname, char string[MAX_ZEILEN][MAX_LAENGE], float zahlen[MAX_ZEILEN])
    {
        FILE *fp;
        char x[MAX_LAENGE];
        float y;
        int i;
    
        fp = fopen("./Liste.txt", "r");
    
        if (fp == NULL)
            {
                perror("Datei konnte nicht geöffnet werden.");
                exit(-1);
            }
    
        i=0;
        while(!feof(fp))
            {
                fscanf(fp,"%s %f", x, &y);
                string[i][i] = x[MAX_ZEILEN];
                zahlen[i] = y;
                i++;
            }
    i--;
    
    fclose(fp);
    return (i);
    }
    
    int main (){
    
        char dateiname;
        float zahlen[MAX_ZEILEN];
        char string[MAX_LAENGE][MAX_ZEILEN];
        int j, anzahl;
    
            anzahl = Eingabe(&dateiname, string, zahlen);
    
        for (j=0; j < anzahl; j++)
            {
                printf("%d. String %s mit Zahl%f\n", j, string[j], zahlen[j]);
            }
    
    return EXIT_SUCCESS;
    }
    

    Ich muss kurz vor meiner Problemstellung sagen, dass ich mit C erst angefangen habe und ich mich in der Thematik noch sehr durchkaue.

    Also, gewollt ist, dass eine Liste "Wort Zahl" aus einer Textdatei ausgelesen wird und im Array(?) gespeichert wird. Die main-Funktion soll folgend diese wie o.g. darstellen. Mein Problem ist jetzt aber, dass zwar die Zahlen korrekt sind, aber die Wörter nicht wiedergegeben werden, obwohl mir kein warnung oder error angezeigt wird.
    Mein Verdacht ist, dass ich es an der Zeile 28 liegt. Eine Ansatz zur Lösung fehlt mir aber leider.

    Für eine Hilfestellung wäre ich sehr dankbar 🙂

    Gruß!



  • Ja, mit Zeile 28 hast du Recht.
    Entweder String kopieren mittels

    strcpy(string[i], x);
    

    oder aber gleich in das Array einlesen:

    fscanf(fp, "%s %f", string[i], &zahlen[i]);
    

    PS: Kennst du schon Strukturen (struct)? Denn dann könntest du ein Array von einer Struktur anlegen (anstatt zwei getrennte Arrays für "wort" und "zahl").

    PPS: Deine Leseschleife mittels feof ist falsch, da diese Funktion erst 'true' zurückgibt, wenn der letzte Dateizugriff nicht erfolgreich war (also nicht im voraus, so daß du dann eine Zeile zu viel einlesen würdest).
    Besser ist es, den Rückgabewert von fscanf auszuwerten - dieser gibt die Anzahl der eingelesenen Werte an, d.h. bei deinem Code also auf 2 vergleichen).



  • int Eingabe(const char* dateiname, char string[MAX_ZEILEN][MAX_LAENGE], float zahlen[MAX_ZEILEN])
    {
        exit(-1); /* verbreitete Anfänger-Unsitte: übergib 1,2,3 oder EXIT_FAILURE, aber keine negativen Werte */
    ...
        char dateiname; /* hier ist Platz für genau 1 char, da passt kein Dateiname + '\0' rein */
        float zahlen[MAX_ZEILEN];
        char string[MAX_LAENGE][MAX_ZEILEN]; /* genau verkehrt herum definiert als übergeben */
        int j, anzahl;
    
            anzahl = Eingabe(&dateiname, string, zahlen);
    ...
    

    Eine Bereichsprüfung für deine Arrays fehlt auch noch.


Anmelden zum Antworten