Datei auslesen...



  • Hallo,

    habe da eine superkompizierte Aufgabe 🙂

    Es liegt eine Datei mit folgendem Inhalt vor:

    2E28    4EA1    5D41    E673    12A9    FE98
    DE28    AEA1    21B8    BEA1    5BB1    CA73
    591D    C23A    582F    DF19    14B1    CA37
    

    Zwischen den Werten befinden sich immer 4 Leerzeichen.

    Die Datei soll geöffnet werden und über eine Schleife sollen die Werte (4 Zeichen+Leerzeichen) eingelesen und in dem Array (config[1000][6]) gespeichert werden.

    Hier mal mein Code:

    #include <stdio.h>
    #include <string.h>
    
    int main (void){
    
        FILE *quelle;
        char config[1000][6], datei[100], str[30];
        int n, m=0;
    
        printf("Bitte Dateinamen angeben: "); gets(datei);
    
        quelle = fopen(datei,"r");
    
        if(!quelle){
            printf("Fehler beim Oeffnen der Datei...\n");
        }
        else {
             while(!feof(quelle)){
                 for(n=0;n<7;n++){
                     fgets(str,9,quelle);
                     //config[m][n] = str;           
                     printf("%s",str);
                 }
                 m++; 
             }
        }
    
        fclose(quelle);
        getchar();
        return(0);
    }
    

    Das erzeugt diese Ausgabe:
    http://s1.directupload.net/images/140401/temp/lghwvb65.jpg

    In meiner Doku steht, dass fgets() n-1 Zeichen einliest. 4 Zeichen + 4 Leerzeichen = 8. 9-1 = 8. Was mache ich hier falsch?

    Wenn ich diese Zeile im Code aktiviere:

    config[m][n] = str;
    

    erhalte ich einen Compilerfehler: Assignment makes integer form pointer without a cast.

    Ok, m ist ein Integer, den ich in die erste Spalte des Arrays config (har) speichern möchte. Das geht nicht.
    Aber das Array config muss ich doch als char initialisieren, weil die Werte aus Buchstaben und Zahlen bestehen, oder?

    Grüße & Danke, Felted



  • felted schrieb:

    habe da eine superkompizierte Aufgabe 🙂

    Es liegt eine Datei mit folgendem Inhalt vor:

    2E28    4EA1    5D41    E673    12A9    FE98
    DE28    AEA1    21B8    BEA1    5BB1    CA73
    591D    C23A    582F    DF19    14B1    CA37
    

    Zwischen den Werten befinden sich immer 4 Leerzeichen.

    Die Datei soll geöffnet werden und über eine Schleife sollen die Werte (4 Zeichen+Leerzeichen) eingelesen und in dem Array (config[1000][6]) gespeichert werden.

    Das ist die Aufgabe? Oder das ist das, was Du aus der Aufgabe gemacht hast?

    Es könnte ja auch sein, dass Du eine Datei hast in der jede Zeile aus 6 Hexzahlen besteht, die jeweils ein bestimmtes Exemplar einer "Klasse" config beschreiben.

    Je nachdem kann die Antwort nämlich gänzlich unterschiedlich ausfallen.



  • fscanf macht alles was du brauchst.

    int main (void){
    
        FILE *quelle;
        char config[1000][6][5], datei[100];
        int m=0;
    
        printf("Bitte Dateinamen angeben: "); scanf("%99s",datei);
    
        quelle = fopen(datei,"r");
    
        if(quelle){
             while(6==fscanf(quelle,"%4s%4s%4s%4s%4s%4s",config[m][0],config[m][1],config[m][2],config[m][3],config[m][4],config[m][5]))
                 m++;
             fclose(quelle);
        }
    
        return 0;
    }
    


  • Ich lehn mich mal ein bisschen aus dem Fenster und nehme an, dass der Dateiinhalt als hexadezimale Zahlen interpretiert werden soll, an deren Werten der TE interessiert ist. In dem Fall:

    #include <stdint.h>
    #include <stdio.h>
    
    ...
    
    FILE *fd = fopen("foo.conf", "r");
    uint16_t config[1000][6]; // Die Beispieldaten lassen 16-Bit-Integer vermuten.
    size_t i, j;
    
    for(i = 0; i < 1000; ++i) {
      for(j = 0; j < 6 && fscanf(fd, " %hx", &config[i][j]) == 1; ++j)
        ; // intentionally left blank
    
      if(j != 6) {
        // Keine komplette Zeile war mehr in der Datei (oder Lesefehler).
        break;
      }
    }
    
    // Prüfungen auf Fehlerzustände wie folgt:
    if(!feof(fd)) {
      // Lesefehler oder Datei zu groß.
    } else if(j != 0) {
      // Letzte Zeile war unvollständig.
    } else {
      // Alles okay.
    }
    


  • Besten Dank für die Hilfe.

    Angenommen die Werte (2E28...) sollen als String in dem Array config[1000][6] abgelegt werden.

    Wie macht an das?

    Für die Zeilen (1000) benötige ich als Wert einen Integer. In die Spalten (6) sollen dann aber Strings abgelegt werden.

    Mit welchem Datentyp soll ich nun das Array initialisieren?

    Grüße, Felted



  • felted schrieb:

    Angenommen die Werte (2E28...) sollen als String in dem Array config[1000][6] abgelegt werden.

    Wie macht an das?

    Das hat Wutz doch schon geschrieben.

    Du brauchst in den 6 Spalten Platz für 5 Zeichen. Bei 1000 Zeilen hast du dann ein 3D-Array:

    char config[1000][6][5];
    

    Du kannst dir auch mit einem typedef behelfen.

    typedef char zahlenstring[5];
    
    zahlenstring config[1000][6];
    

    Es bleiben aber Arrays und eine Zuweisung ala config[m][n] = str; geht da auch nicht.

    felted schrieb:

    Für die Zeilen (1000) benötige ich als Wert einen Integer. In die Spalten (6) sollen dann aber Strings abgelegt werden.

    In diesem Array benutzt du die Integer nur als Index. Die Integer werden da nicht abgespeichert.

    felted schrieb:

    Mit welchem Datentyp soll ich nun das Array initialisieren?

    Das bleibt immer noch ein (3D-)Array von char. Da ist '\0' (oder auch 0) keine schlechte Idee.



  • Danke - jetzt verstehe ich das schon besser.

    Noch eine Frage.

    Das geht nicht (incompatible types in assignment ):

    char config[1000][6][5], str[5];
    for(n=0;n<6;n++){
        fscanf(quelle,"%4s",str);           
        config[m][n] = str;  
    }
    

    Das geht:

    char config[1000][6][5], str[5];
    for(n=0;n<6;n++){
        fscanf(quelle,"%4s",config[m][n]);           
    }
    

    Wieso?

    Grüße, Felted



  • Weil char config[1000][6] ein Array vom Typ char[5] ist.

    Grundlagen der Stringverarbeitung. Siehe auch strcpy



  • Vielen Dank - Felted


Log in to reply