Wert rausfiltern und speichern
-
Hi,
aus einer TXT-Datei, welche ich einlese, möchte ich gerne 2 Werte speichern.
Mein Problem ist, das die Zeilen immer verschieden strukturiert sein kann.BSP:
X=50 Y=12 Z=30
oder
Y=40 X=12 Z=30
Die Werte sind immer ganzzahlig...Wie komme ich z.B. am besten an die X-Werte, um sie dann in einen Int umzuwandeln ?
Dominik
-
char z[BUFSIZ]; while( fgets( z,BUFSIZ,filep ) ) { const char *x=strchr(z,'X'); if( x && strchr(x,'=') ) printf("\nX=%d",atoi(strchr(x,'=')+1) ); }
-
danke für deine schnelle Antwort...
das Programm läuft durch, aber leider ignoriert er die Ausgabe..
Hattest du das Programm getestet ?
Dominik
-
Was soll nicht laufen?
-
sofern keine Fehlermeldung erscheint und wirklich keine Ausgabe auf dem Bildschirm, wird wohl die if-Abfrage nicht wahr zurückliefern, also scheint in der Datei kein "X=##" (## steht für eine Zahl) stehen.
-
atoi liefert für Nichtzahlen 0, d.h. wenn nichts erscheint steht in keiner Zeile ein 'X' gefolgt von einem '=', wobei neben "X=" auch "X =" usw. erkannt werden.
-
Es wird aber auch ein unsinniges "=X" erkannt oder?
-
Nein.
Das '=' wird erst ab 'X' gesucht.Ein Fehler kann noch ein 'x' sein.
-
danke erstmal für eure Hilfe...Leider funktioniert es nicht so wie ich mir das vorstelle, da ich den X-Wert aus der nächsten Zeile raussuche, um in in die vorige Zeile zu schreiben.. Hier mal der Quellcode:
int CCbfk::Pre( char *FileName, char *PreName ) { FILE * fpIn, * fpOut; FILE* datei; char Zeile[300] while (( fgets( Zeile, 200, fpIn )) != NULL ) // Zeilenweisen oeffnen if( strstr(Zeile,"TEST")) { /* hier der Vorgriff auf naechste Zeile */ char z[200]; fpos_t pos; fgetpos( fpIn, &pos ); if( fgets( z,200,fpIn ) ) { char y[200]; if ((strstr( Zeile, "X=" )) != NULL ) { const char *x=strchr(Zeile,'X'); if( x && strchr(x,'=') ) fprintf(fpOut, "\nX=%d",atoi(strchr(x,'=')+1) ); } } fsetpos( fpIn, &pos ); } fclose( fpIn ); fclose( fpOut ); return 1;
Programm soll, falls in der Zeile "TEST" vorkommt, den X-Wert aus der nächsten Zeile suchen und in der Zeile mit TEST ausgegeben.
BSP:
Input
X=3
TEST
Y=3
TEST
X=4Output
X=3
TEST
Y=3
X=4 TEST
X=4Vielleicht kann mir jemand weiterhelfen, da er nix ausgibt...
-
Oh Mann, bekommst du das nicht allein hin?
Stattfprintf(fpOut, "\nX=%d",atoi(strchr(x,'=')+1) );
einfach
fprintf(fpOut, "\n%d",atoi(strchr(x,'=')+1) );
oder meinetwegen gleich
fprintf(fpOut, "\nTEST %d",atoi(strchr(x,'=')+1) );
-
Hi,
nein das ist ja nicht mein Problem, die Ausgabe bekomme ich schon hin...
Nur passt die Reihenfolge irgendwie nicht:Input
TEST
X=30
X=30 ANG=30 RND=60
X=30 ANG=60
Y=20Ist-Output
TEST
X30TEST 30X30 ANG=30 RND=60
TEST 30X30 ANG=60
Y20Soll-Output
X=30 TEST
X=30
X=30 ANG=30 RND=60
X=30 ANG=60
Y=20
-
Das Problem ist nicht die Vorgriffsfunktionalität, sondern wie du sie verwendest und dein aufrufender Kontext:
char z[200]; while( fgets(z,200,fpIn) ) { if( strstr(z,"TEST") ) { /* hier der Vorgriff auf naechste Zeile */ char x[200],y[200]; fpos_t pos; fgetpos( fpIn, &pos ); if( fgets(x,200,fpIn) && strstr(x,"X=") && 1==sscanf(strstr(x,"X="),"X=%s",y) ) fprintf(fpOut,"X=%s %s",y,strstr(z,"TEST")); else fputs(z,fpOut); fsetpos( fpIn, &pos ); } else fputs(z,fpOut); }
-
Danke Wutz !! Hätte da jetzt noch ein paar Tage drauf schauen können, ohne den Fehler zu finden...