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.jpgIn 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