Kleines Problem mit FILE Pointern



  • Hi, habe folgendes Programm welches aus einer Datei qsort.txt ein Paar zahlen aus lesen soll und auf dem Bildschirm ausgeben soll.

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 30
    
    int main(void)
    {
    	FILE *fp;
    	int anz, i;
    	int feld[MAX];
    
    	fp = fopen("D:\\Studium\\Informatik 2\\Labor\\Aufgabe 3.1\\qsort.txt","r+b");
    
    	anz = fread(&feld, sizeof(int), MAX, fp);
    
    	printf("\n %i", anz);
    
    	for(i = 0; i < MAX; i++)
    	{
    		printf("\nWert: %i", feld[i]);
    	}
    
    	return 0;
    }
    

    Das Programm läuft, schreibt mir die Zahlen jedoch net ins Array rein 😞

    in der qsort.txt steht das:

    16 15 2 8 4 23 42
    

    Was hab ich falsch gemacht?



  • fread liesst das file als rohdaten 😉
    nimm besser 'fscanf' für sowas...



  • Oder du liest mir fgetc alle Zeichen bis zum nächsten Whitespace ein und konvertierst dann mit aton die Zeichenkette in eine Zahl.



  • gut, jetzt liest er die erste zahl ins Element, denke mal er bricht ab wegen dem leerzeichen...

    Dachte mir jetzt so spontang ihn per for schleife mehrmals einlesen zulassen...naja der gedanke wurde gleich wieder verworfen da er ja sonst immer das erst einliest.

    hmm bin grad echt ratlos, google gibt mir leider auch net die entsprechende info zu fscanf() also zum aufruf schon aber halt net wie ich mehr sachen einlese



  • Du solltest erstmal schauen, fopen überhaupt richtig funktioniert hat oder ob der Filepointer NULL ist. Gerade mit nem Leerzeichen im Dateipfad.



  • Du mußt IN DER Schleife per fscanf() den nächsten Wert einlesen und dann ausgeben:

    for(i=0;i<MAX;++i)
    {
      fscanf("%d",feld[i]);
      printf("%d ",feld[i]);
    }
    


  • hmm so würde der code aber nicht funktionieren oder? bei fscanf wird ja kein Filepointer übergeben,

    also sinn des programms soll sein aus einer datei ein paar zahlen einzulesen und per qsport zu sortieren





  • aber so schreibt er mir ja immer den ersten wert (16) in jedes Element der Variablen...ich möchte ja die einzelnen Zahlen in die Elmente speichern.

    Edit: Ok es funktioniert jetzt.

    Jetzt hba ich ja ein Array mit 30 Elementen, möchte das array aber variabel halten,d.h. wenn 5 Zahlen in der Datei stehen sollen soll das Array auch nur 5 Elemente haben, aber wie kann ich das vor dem Auslesen wissen? gibt fscanf nicht die anzahl der erfolgreich gelesenen Werte zurück? aber dann müsste zu dem Zeitpunkt das Array schon bestimmt sein...hmmm



  • Wie kommst du denn da drauf? Probier das doch einfach mal aus, bevor du Vermutungen anstellst.

    Im FILE gibt es auch einen Lesezeiger, dort merkt sich dein Programm, bis wohin es die Datei schon gelesen hat. Und beim nächsten fscanf() macht es genau dort weiter, wo es aufgehört hat.

    Jetzt hba ich ja ein Array mit 30 Elementen, möchte das array aber variabel halten,d.h. wenn 5 Zahlen in der Datei stehen sollen soll das Array auch nur 5 Elemente haben, aber wie kann ich das vor dem Auslesen wissen? gibt fscanf nicht die anzahl der erfolgreich gelesenen Werte zurück? aber dann müsste zu dem Zeitpunkt das Array schon bestimmt sein...hmmm

    Du könntest das Array dynamisch anlegen und per realloc() so weit wachsen lassen, wie du es benötigst.
    (und mit feof() kannst du prüfen, ob du fertig bist mit Einlesen)



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	FILE *fp;
    	int anz, i = 2;
    	int *arr;
    
    	fp = fopen("D:\\Studium\\Informatik 2\\Labor\\Aufgabe 3.1\\qsort.txt","r+b");
    	arr = calloc(1, sizeof(int));
    
    		fscanf(fp,, "%d", arr);
    		arr = (int *)realloc(2, sizeof(in));
    		while(feof(fp) == 0)
    		{
    			arr++
    			fscanf(fp, "%d", arr);
    			arr = (int *)realloc(i+1, sizeof(int));
    			i++;
    		}
    
    		//printf("\nWert: %i", feld[i]);
    
    	return 0;
    }
    

    Soweit bin ich bis jetzt schon gekommen, allerdings stürzt er bei der Zeile mit Realloc ab



  • Ja, das heißt ja auch "arr = realloc(arr,(i+1)*sizeof(int));".

    Und das arr++ solltest du weglassen und stattdessen lieber über einen Index auf das letzte Element zugreifen:

    i=0;
    while(!feof(fp))
    {
      arr = realloc(arr,(i+1)*sizeof(int));
      fscanf(fd,"%d",arr[i]);
      ++i;
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	FILE *fp;
    	int anz, i = 0;
    	int *arr;
    	fp = fopen("D:\\Studium\\Informatik 2\\Labor\\Aufgabe 3.1\\qsort.txt","r+b");
    	arr = calloc(1, sizeof(int));
    
    		fscanf(fp, "%d", arr);
    		arr = realloc(arr, 2*sizeof(int));
    		arr[i+1];
    		while(!feof(fp))
    		{
    			fscanf(fp, "%d", arr[i]);
    			arr = realloc(arr, 3*sizeof(int));
    			//arr = realloc(arr,(i+1)*sizeof(int));
    			i++;
    			//arr++;
    		}
    
    	return 0;
    }
    

    so bin jetzt am verzweifeln, hab das jetzt mit dem Index versucht, er stürzt jetzt in der while schleife beim ersten durchlauf beim fscanf befehl ab, wegen dem Index. Ohne ihn gibts nette speicherfehler beim realloc in der while. das erste Realloc oben funktioniert...ich dreh noch durch... brauch jetzt erstmal ne pause...sitz hier seit 7 uhr und programmier...kopf ist jetzt echt voll 🙂



  • Sorry, mein Fehler - fscanf() braucht ja die Adresse - also muß das "&arr[i]" oder "arr+i" heißen.

    (und mit der Speichervergrößerung solltest du mal auf die Reihenfolge achten - erst realloc(), dann fscanf(), sonst schreibst du über das Ende deiner Daten hinaus)



  • ne das ist schon ok so, ich hol ja erst mit calloc den speicher, dann erstes fscanf, dann realloc den speicher vergrößern. jetzt in der while wieder fscanf und dann erneut die vergrößerung

    so siehts jetzt aus

    http://img50.imageshack.us/img50/3236/untitled2pg2.th.jpg

    muss ich beim realloc dann auch mit dem indexs arbeiten? eigentlich schon oder?



  • Ich hab den Thread mal in Ruhe durchgelesen und hoffe das ist was du brauchst:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        FILE *fp = NULL;
        int *array = NULL, i = 0, j = 0;
        if((fp = fopen("D:\\Studium\\Informatik 2\\Labor\\Aufgabe 3.1\\qsort.txt","r+b")) == NULL)
            return EXIT_FAILURE;
        do
        {
            if(array == NULL)
            {
                if((array = (int *)malloc(sizeof(int))) == NULL)
                    return EXIT_FAILURE;
            }
            else
            {
                if((array = (int *)realloc(array, ++i * sizeof(int))) == NULL)
                    return EXIT_FAILURE;
            }
        }
        while((fscanf(fp, "%d", &array[i])) != EOF);
        fclose(fp);
        fp = NULL;
        for(j = 0; j < i; j++)
            printf("Wert: %d\n", array[j]);
        free(array);
        array = NULL;
        return EXIT_SUCCESS;
    }
    

    Viel Spaß damit 😉



  • wird durch das ++i der Index auch schon hochgezählt? ja oder?
    Danke für den Code 😃



  • mazeli schrieb:

    wird durch das ++i der Index auch schon hochgezählt? ja oder?

    Geneauso ist es.



  • hmm also das programm scheint so nicht zu funktionieren, zumindest gibt er mir nur die erste zahl richtig aus und dann nur noch irgendwelche werte



  • meine Variante:

    #include <stdio.h> 
    #include <stdlib.h> 
    
    #define pfad "D:\\Studium\\Informatik 2\\Labor\\Aufgabe 3.1\\qsort.txt"
    int main() 
    { 
        FILE* fp;   
        int tmp, temp;
        int* array;     
    
        if ((fp = fopen(pfad,"r+b")) == NULL) 
            return EXIT_FAILURE; 
        for (tmp = 0; fscanf(fp, "%d", &temp) != EOF; tmp++); 
        fclose(fp);
    
        array = (int*) malloc(tmp*sizeof(int));
    
        if ((fp = fopen(pfad,"r+b")) == NULL) 
            return EXIT_FAILURE; 
        for (tmp = 0; fscanf(fp, "%d", &array[tmp]) != EOF; tmp++) 
            printf("Wert: %d\n", array[tmp]); 
    
        fclose(fp);
        free(array); 
        array = NULL; 
        return EXIT_SUCCESS; 
    }
    

    🕶


Anmelden zum Antworten