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=4

    Output

    X=3
    TEST
    Y=3
    X=4 TEST
    X=4

    Vielleicht kann mir jemand weiterhelfen, da er nix ausgibt...



  • Oh Mann, bekommst du das nicht allein hin?
    Statt

    fprintf(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=20

    Ist-Output

    TEST
    X30

    TEST 30X30 ANG=30 RND=60

    TEST 30X30 ANG=60
    Y20

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


Anmelden zum Antworten