daten aus file in c-array einlesen
-
hallo zusammen
ehrlich gesagt ist es mir etwas peinlich diese "triviale" frage zu stellen, aber ich habe wirklich noch keine lösung gefunden.
ich wollte daten aus einem einfachen textfile unter linux in einen c-array einlesen. das file sieht folgendermassen aus:
1 2 3 4 5 6 7 ... bis 20 und dann ein newline.bis jetzt habe ich folgenden code zusammengestellt:
int main (void) { char pfad[200] = "/tmp/array"; FILE *textfile; int daten[20], i; int *datptr = daten; // printf("Pfad zur Datei eingeben: \n"); // scanf("%s", &pfad); if ((textfile = fopen(pfad, "r")) == NULL) { fprintf(stderr, "ERROR: kann datei %s nicht oeffnen\n", pfad); return 1; } fread(datptr, sizeof(int), 20, textfile); for (i = 0; i < 20; i++) { printf("%d\n", *datptr); datptr++; } if (fclose(textfile) == EOF) { fprintf(stderr, "ERROR: kann datei %s nicht schliessen\n", pfad); return 1; } return 0; }
der output dazu sieht folgendermassen aus:
540155953
540287027
540418101
540549175
808525881
540094752
824193585
875634739
540356896
824194609
942743607
540619040
134492210
1867325489
1699094638
32
0
0
1940
-1210201266irgendwie sehen diese werte für mich eher nach addressen aus als nach den werten (1-20), welche ich im textfile habe.
da ich bisher nirgends angegeben habe, wie die werte getrennt sind (in diesem falle durch einen leerschlag), könnte ich mir das als fehlerquelle vorstellen.
werden die werte korrekt eingelesen oder werden etwa die leerschläge mitcodiert und dann einfach jeweils 32 bit als einen wert interpretiert?wie ihr unschwer feststellen könnt, bin ich relativ unerfahren was c betrifft (habe c lediglich im zusammenhang mit assembler "gelernt").
für einen tipp wäre ich dankbar
beste grüsse
thomas
-
fread liest deine Eingabewerte als Binärdarstellung einer int-Zahl, d.h. aus "1 2 " wird 0x20322031 = 540155953 (big endian). Um die Text-Darstellung deiner Zahlen auszulesen, solltest du lieber fscanf() in einer Schleife verwenden.
-
Besten Dank für die rasche Antwort!
Mein Problemchen konnte ich damit lösen (wobei ich einen neuen Pointer einführen musste):
while(fscanf(textfile, "%i", datptr2) != EOF) datptr2++;
Zu deinem Kommentar: Ist es nicht so, dass ich einen little-endian habe (IBM Laptop mit Intel Prozessor)? Wie kommst du genau auf 0x20322031?
Falls ich folgendes mache auf meinem Laptop
char xx[] = {3 5 7 9 15 31 63 64}; p = &xx; printf("%x\n", *p);
bekomme ich folgende Ausgabe:
9070503Das ist doch little-endian, oder?
Danke nochmals!
-
ThomasUth schrieb:
Zu deinem Kommentar: Ist es nicht so, dass ich einen little-endian habe (IBM Laptop mit Intel Prozessor)? Wie kommst du genau auf 0x20322031?
Sorry, aber den Unterschied habe ich noch nicht verinnerlicht (ich weiß schon, daß es einen Unterschied zwischen BE und LE gibt, aber welcher was ist, ist mir ehrlich gesagt egal).
-
Sorry, aber den Unterschied habe ich noch nicht verinnerlicht (ich weiß schon, daß es einen Unterschied zwischen BE und LE gibt, aber welcher was ist, ist mir ehrlich gesagt egal).
Kann ich nachvollziehen. Nur sollte ich unter anderem morgen solche Dinge während der Prüfung intus haben.