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 mitwhile(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ß HiFishEs 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; }