Einlesen von Text



  • bei mir steht "memset undeclared"

    was heißt das?



  • habe memset einmal weggelöscht und jetzt gehts!
    DANKE!
    das einzige ist, dass wenn die Zahl ne kommazahl ist, das es das ganze irgendwie ned nimmt, was nach dem komma steht!
    weißt du warum?

    dann quäl ich dich nimma 😉



  • Komma ist ein deutsches Dezimaltrennzeichen. Du mußt schon nen Punkt nehmen. Also entweder du ersetzt das Komma oder parst die Werte manuell.



  • Habe eh einen Punkt verwendet und es liest trotzdem nur die Zeichen ein, die vor dem Punkt sind!

    wieso das?



  • Alexander2183 schrieb:

    habe memset einmal weggelöscht und jetzt gehts!
    DANKE!

    das ist aber megamäßig unempfehlenswert!
    probieama das da drüba: #include <string.h>



  • Das er nur die Werte vor dem Punkt oder Komma liest liegt daran, dass du sie in Integer Variablen und nicht in Float Variablen packst.



  • Nimm das hier, dann kannste die Kommas auch drin lassen.

    double num = 0;
    int quotient = 0;
    
    while(isdigit(c = fgetc(fp))) {
        num = num * 10 + (c - '0');
    }
    // catch floating points
    if(c == ',') {
        quotient = 1;
        while(isdigit(c = fgetc(fp))) {
            num = num * 10 + (c - '0');
            quotient *= 10;
        }
        num /= quotient;
    }
    ungetc(c, fp);
    

    Hab ich jetzt nicht geteste aber sollte funzen, evtl mußt du schauen, daß er sobal isdigit false wird, den nächsten Buchstaben, den er ja schon gelesen hat, wieder zurücktust. Aber ich würde hier eigentlich eher mit einem Linebuffer arbeiten, wenn ich du wäre.



  • Nur mal so interessehalber:
    Was spricht dagegen die Funktionen, die ich vorgeschlagen habe zu verwenden? Ist an denen irgendwas verkehrt? Irgendwie finde ich das eine viel unkompliziertere Lösung.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	char str[] = "N001 G01 X34,45Y122,53Z2343,12";
        // das Einlesen aus der Datei schenke ich mir jetzt mal
    
    	char   *start, *strX, *strY, *strZ, *comma;
    	double x, y, z;
    
    	start = strtok(str, "X");
    	strX  = strtok(NULL, "Y");
    	strY  = strtok(NULL, "Z");
    	strZ  = strtok(NULL, " ");
    
    	comma = strchr(strX, ',');
    	*comma = '.';
    	comma = strchr(strY, ',');
    	*comma = '.';
    	comma = strchr(strZ, ',');
    	*comma = '.';
    
    	x = atof(strX);
    	y = atof(strY);
    	z = atof(strZ);
    
    	return 0;
    }
    


  • Stichpunktgeber schrieb:

    Nur mal so interessehalber:
    Was spricht dagegen die Funktionen, die ich vorgeschlagen habe zu verwenden? Ist an denen irgendwas verkehrt? Irgendwie finde ich das eine viel unkompliziertere Lösung.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	char str[] = "N001 G01 X34,45Y122,53Z2343,12";
        // das Einlesen aus der Datei schenke ich mir jetzt mal
    
    	char   *start, *strX, *strY, *strZ, *comma;
    	double x, y, z;
    
    	start = strtok(str, "X");
    	strX  = strtok(NULL, "Y");
    	strY  = strtok(NULL, "Z");
    	strZ  = strtok(NULL, " ");
    
    	comma = strchr(strX, ',');
    	*comma = '.';
    	comma = strchr(strY, ',');
    	*comma = '.';
    	comma = strchr(strZ, ',');
    	*comma = '.';
    
    	x = atof(strX);
    	y = atof(strY);
    	z = atof(strZ);
    
    	return 0;
    }
    

    Ne Frage:
    Kannst du mir dass vielleicht nochmal senden mit der Stelle inklusive wo ich die datei einlese, irgendwie gehts bei mir ned, wenn ichs selbst mache!
    Damit es geht wenn ich mit dem selben code compiliere!

    😉
    danke



  • Ach ja, und ne frage:
    wenn ich, was ja möglich ist, einmal nur ne X Koordinate habe und kein Z oder Y, oder einmal nur X und Z und so weiter habe, geht das dann trotzdem?

    am einfachsten fand ich den ersten Code:

    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <string.h> 
    
    #define NUMLENMAX 10
    FILE* fp = NULL;
    float x=0,y=0,z=0;
    char buf [NUMLENMAX+1]={0};
    
    float get_num ()
    {
        int c = 0;
        int i = 0;
        memset(buf,0,sizeof(buf)); 
        while (isdigit(c=fgetc(fp)))
        {
            buf[i++] = c;
            if ( i == NUMLENMAX )
            {
                printf( "Buffer full!" );
                break;
            }
        }   
        ungetc(c,fp);
        return atol(buf);
    }
    
    float get_x ()
    {
        x = get_num ();
        printf ( "x = %f\n", x );
        getchar();
    }
    float get_y ()
    {
        y = get_num ();
        printf ( "y = %f\n", y );
        getchar();
    }
    
    float get_z ()
    {
        z = get_num ();
        printf ( "z = %f\n", z );
        getchar();
    }
    
    int main( int arg, char* argv[] )
    {
        int c=0;
        fp = fopen ("C:\\Ich.txt", "rb");
        if ( !fp )
            return 0;
    
        while ( c != EOF )
        {
            c = fgetc (fp);
            switch (c)
            {
                case 'X':
                    get_x ();
                break;
                case 'Y':
                    get_y ();
                break;
                case 'Z':
                    get_z ();
                break;
            }
        }
        fclose(fp);
      return 0;
     }
    

    Hier war nur das Problem, das es mir nicht die Zahlen nach dem Komma bzw. '.' ausgibt aus der textdatei, sondern nur die davor!

    ich wünsch mir zum glück nur nen code, der genau wie hier gegeben, auch geht bei mir, mit dem doofen komma und auch wenn ich mal nur ne bestimme koordinate habe, nicht alle drei!



  • bloss keinen finger selber krumm machen oder wie.



  • Habs ja eh versucht, ich weiß nur ned wie ichs zum laufen kriege.


Anmelden zum Antworten