Filepointer spinnt?



  • Ich will die anzahl der benuetzten CPUs aus einer Textdatei extrahieren. Dazu schau ich ob der string "resources_used.ncpus = " vorhanden ist dann will ich per fgets die anzahl holen. Nur werd ich aus der Ausgabe gar nicht schlau, erstens steht die komplette zeile in dem array "cpu_anz" zweitens ersetze ich mit dem pointer (der anzeigt wo der string gefunden wurde) den wert des filepointer und der wird auf einmal exorbitant riesig warum auch immer ?!?
    (der string wird ja in der aktuellen zeile gefunden also duerfte point nur minmal größer sein)

    ich hoffe jemand is aus dem was ich hier fasele schlau geworden un sieht vllt den Fehler

    Ausgabe des Programms:

    PID: 886786
    0 CPUs
    fp1: 220
    fp2: 805308977
    Cpu_anz:
    
    PID: 892730
    0 CPUs
    fp1: 221
    fp2: 939526705
    Cpu_anz:
    

    Quellcode:

    while(feof(fp)==0 && abort==0)
            {
                    fgets(s,100,fp);
                    point=strstr(s,"resources_used.ncpus = ");
                    //printf("%s",s);
                    if(point!=NULL)
                    {
                            point=point+23;
    
                            printf("fp1: %d\n",ftell(fp));
                            fsetpos(fp,point);
                            printf("fp2: %d\n",ftell(fp));
                            fgets(cpu_anz,3,fp);
                            printf("Cpu_anz: %s\n",s);
                            cpu=atoi(cpu_anz);
                            abort=1;
                    }
            }
    

    Gruß HiFish

    Edit: hab grad gesehen das ich noob s anstatt cpu_anz ausgegeben hab -.- hab die neue ausgabe gepostet



  • Verstehe überhaupt nicht was du das machen willst.
    Du hast den string ja schon eingelesen ( in s ). Warum versuchst du jetzt die Fileposition zu ändern um den string nochmal zu lesen ?
    BTW sieh dir fsetpos(); mal genauer an. Du setzt den Filepointer auf die Speicheradresse innerhalb von s an der die cpu-anzahl steht. ( File-position und Hauptspeicher haben nichts miteinander zu tun.)
    Wie wär's mit

    while(feof(fp)==0 && abort==0) {
        fgets(s,100,fp);
        point=strstr(s,"resources_used.ncpus = ");
        if(point!=NULL) {
           point=point+23;
           cpu=atoi(point);
           printf("Cpu_anz: %d\n",cpu);
        }
    }
    

    Kurt



  • habs jetzt mit fseek gelöst aber danke fuer die antwort 🙂
    zu deiner frage ich les ja die ganze Zeile in s ein ich will aber nur den wert am ende der zeile drum will ich den filepointerdorthin verschieben, damit ich fgets benuetzen kann.
    Gruß HiFish



  • HiFish schrieb:

    habs jetzt mit fseek gelöst aber danke fuer die antwort 🙂
    zu deiner frage ich les ja die ganze Zeile in s ein ich will aber nur den wert am ende der zeile drum will ich den filepointerdorthin verschieben, damit ich fgets benuetzen kann.
    Gruß HiFish

    Es gibt immer mehrere Wege ans Ziel. Deiner ist aber mit der Kirche ums Kreuz. 🙂
    Kurt



  • viel spass und bitte auch verstehen und nicht nur kopieren und gute zensuren einsacken...

    #include <stdio.h>
    #include <string.h>
    
    #define BUFLEN 1024
    const char *file = "input.txt";
    const char *param = "resources_used.ncpus"; /* danach wird gesucht */
    
    int main(void)
    {
    	FILE *fp;
    	char buffer[BUFLEN];
    	int cpus, res;
    
    	if (!(fp = fopen(file, "r")))
    	{
    		puts("error: fopen()");
    		return 1;
    	}
    
    	while (!feof(fp) && !ferror(fp))
    	{
    		fgets(buffer, BUFLEN, fp);
    
    		if (!strstr(buffer, param)) /* nicht gefunden */
    			continue;
    
    		res = sscanf(buffer, "%*[^=] = %i", &cpus); /* zahl auslesen */
    		if (res != 1 || res == EOF) /* gescheitert */
    			continue;
    
    		printf("cpus: %d\n", cpus);
    	}
    
    	fclose(fp);
    
    	return 0;
    }
    

Anmelden zum Antworten