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
    -1210201266

    irgendwie 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:
    9070503

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


Anmelden zum Antworten