(Kleine) Anlaufhilfe
-
Das heißt, ich lösche das isdigit raus und das atol auch und dann sollts gehen?
long get_num () { int c = 0; int i = 0; while (c=fgetc(fp)) { buf[i++] = c; if ( i == NUMLENMAX ) { printf( "Buffer full!" ); break; } } ungetc(c,fp); }
-
Nein. Ich sagte, mit fscanf kannst du dir atol sparen. Außerdem liest du ja so viel zu viel ein. Du müsstest bei deinem Ansatz schon festlegen, was eingelesen werden soll (also alles erlaubt zwischen '0' und '9', Komma und Punkt...).
-
Wie funktioniert fscanf genau?
bzw. wo soll ich das einbauen bei mir?^
-
Lies dir das am besten mal gründlich durch (und probier es aus
):
http://msdn.microsoft.com/de-de/library/cb5kac8b(VS.80).aspx
Weitere Beispiele findest du überall im Netz, z.B. auch hier im Forum (=>SuFu).
-
Na gut, da ich anfängliche Verständnisschwierigkeiten bei fscanf verstehen kann, hier ein Tipp:
int n=0,g=0; float x=0.,y=0.,z=0.; fscanf(fp,"N%d G%d X%fY%fZ%f",&n,&g,&x,&y,&z);
Sollte in etwa hinhauen (ungetestet). Das klappt natürlich nur, wenn die Datei immer gleich aufgebaut ist...
-
Alexander2183 schrieb:
Das heißt, ich lösche das isdigit raus und das atol auch und dann sollts gehen?
Ist das dein Ernst? Weißt du denn immer noch nicht, was die Funktionen machen?
-
b schrieb:
Alexander2183 schrieb:
Das heißt, ich lösche das isdigit raus und das atol auch und dann sollts gehen?
Ist das dein Ernst? Weißt du denn immer noch nicht, was die Funktionen machen?
Ich muss _b_ Recht geben.
Alexander2183, du solltest nicht einfach fremden Code verwenden, ohne ihn zu verstehen. Dass das nicht dein Code ist, hatte ich auch erst überlesen. Zieh dir ein gutes Anfänger-Buch/-Tutorial 'rein und lerne die Basics. Und verwende keine Funktionen (wie isdigit oder atol), ohne dir die Doku durchgelesen zu haben. Das bringt nix, du lernst dabei nichts und wendest die Funktionen wahrscheinlich oft falsch an.
-
_matze schrieb:
Na gut, da ich anfängliche Verständnisschwierigkeiten bei fscanf verstehen kann, hier ein Tipp:
int n=0,g=0; float x=0.,y=0.,z=0.; fscanf(fp,"N%d G%d X%fY%fZ%f",&n,&g,&x,&y,&z);
Sollte in etwa hinhauen (ungetestet). Das klappt natürlich nur, wenn die Datei immer gleich aufgebaut ist...
Ist sie nicht zwangsweise. Das ist CNC- Code und die Kennzeichner müssen modal behandelt werden.
N001 G01 X200.12Y123.31Z33.31 -> x = 200.12, y = 123.31, z = 33.31 N002 G01 X116.02Z50.53 -> x = 116.02, y = 123.31, z = 50.53
Wäre als zweite Zeile zulässig, da kriegst Du mit fscanf nur Daten - Salat raus. Allerdings habe ich schon häufiger gesehen, daß manche CNC- Generatoren immer alle Koordinaten schreiben, nur eben garantiert ist das nicht.
-
Tja, dann muss man halt selbst nen kleinen Parser schreiben. Ich bezweifle aber, dass Alexander2183 das mit seinen Kenntnissen so auf Anhieb hinkriegt. Also => Basics lernen und Schritt für Schritt darauf hinarbeiten!
-
Ja, ich geb allen recht, aber das Problem ist, dass ich eben wirklich nur die basics, und nicht mal die gut kann.
Aber von der Schule aus, brauche ich sowas für ein Projekt, und da hat jeder was andres eben, und ich leider das eben. Deshalb bräuchte ich einfach, so leicht wie möglich, einen Code, der einfach immer wenn er ein X sieht oder Y oder Z die Kommazahl dahinter einliest ausgibt, um die Zahlen X,Y,Z dann in eine Formel einzufügen. Und jetzt hab ich alle eure netten Tips zusammengenommen und bekomme, juhuu(mehr oder weniger) zwei von drei Kommazahlen pro Zeile raus.
Nur die dritte eben nicht.
Wenn ich die Basics lerne und echt von vorn anfange, weil das interessiert mich ja eigentlich auch, könnt ihr mir ausnahmsweise helfen einmal, damit ichs zum laufen kriege, ich setz echt schon stunden, und komm net weiter!#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <limits.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; while (c=fgetc(fp)) // vorher: while (isdigit(c=fgetc(fp))) { buf[i++] = c; if ( i == NUMLENMAX) { // vorher hier noch: printf( "Buffer full!" ); break; } } ungetc(c,fp); return atof(buf); } long get_x () { x = get_num (); printf ( "\n%f\n", x ); getchar(); } long get_y () { y = get_num (); printf ( "\n%f\n", y ); getchar(); } long get_z () { z = get_num (); printf ( "\n%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; }
Textdatei:
N001 G01 X11.33Y22.33Z33.33
Ausgabe:
11.33000033.330002
Das zweite fehlt aber irgendwie!
Da das für euch ja ein klacks ist, bitte, habt erbarmen, ist zwar sonst nicht meine art, aber ich bin am verzweifeln!
-
Die get_num() soll ja nur die nachfolgende float auslesen. Müßte so funktionieren, aber bitte - keine Garantie, hab's mir nicht wirklich angeschaut:
float get_num() { float temp; fscanf(fp,"%f",&temp); return temp; }
Probier's einfach mal ...
-
Ich liebe euch!
Funktioniert super!
Bin schon mal alle funktionen durchgegangen und verstehe es sogar mehr oder weniger!morgen besorg ich mir ein tutorial oder buch für C sogar!
Dank, echt!