datei einlesen und zeilenweise werte ermitteln.
-
hallo!
ich entschuldige mich schon im vorhinein wenn manche fragen von mir banal wirken.
überarbeite gerade in meiner ferialarbeit einen c-code mit programmspezifischen befehlen aus fluent und abaqus.
da meine eigentlichen programmierfähigkeiten nur etwas vb, KOP und labview umfassen ist es nicht umbedingt leicht aufeinmal c zu programmieren...
mittlerweile hab ich schon um die 300 zeilen neu geschrieben und ein großteil funktioniert auch aber an einer stelle hänge ich gerade fest:problem:
ich habe eine txt in der mitten folgendes steht.
*NODE
1, 3.7358, 2.58861, 7.07311
2, 3.46609, 2.63323, 7.07311
3, 8.59066, 13.22947, 7.51764
4, 8.32094, 13.22947, 7.37943
5, 4.00552, 2.1712, 8.31265
6, 4.00552, 1.90148, 8.34576
7, 3.7358, 2.58861, 7.07311
8, 3.46609, 2.63323, 7.07311
9, 8.59066, 13.22947, 7.51764
10, 8.32094, 13.22947, 7.37943die erste zahl ist die knotennummer und der rest die kartesischen koordinaten.
diese werte muss ich zeilenweise einlesen und verarbeiten für fluent.der code (ist nur ein kleiner teilbereich aus dem programms):
FILE *fp; char filename[100]=""; char *token, puffer2[1024] = "", filename[100] ="",puffer[1024] = ""; char find[4] = "NODE"; int n,i,j,timeinter; float x,y,z,ansa_x,ansa_y,ansa_z; fp = fopen("abaqus.inp", "r"); Message("Reading file"); while(fgets(puffer,sizeof(puffer),fp)){ strcpy(puffer2,puffer); token = strtok(puffer2,"\t "); if(strcmp(token,find) == 0) { Message("Requested String Found!\nReading Nodal Numbers!\n",puffer); string_found = TRUE; i = 0; } if (string_found) i++; if ((i > 3)&&(token!=NULL)) { sscanf(puffer,"%11d %E %E %E",&nodeNumber,&x,&y,&z); begin_f_loop(f,tf) { f_node_loop(f,tf,n) { v = F_NODE(f,tf,n); if ((NODE_MARK(v) == 0) && (fabs(NODE_X(v)-(ansa_x/1000))<closeness) && (fabs(NODE_Y(v)-(ansa_y/1000))<closeness) && (fabs(NODE_Z(v)-(ansa_z/1000))<closeness)){ NODE_MARK(v) = nodeNumber; } } } end_f_loop(f,tf); } else if (i>3) break; fclose(fp);
es sollte eigentlich so funktionieren.
wenn *node gefunden wird soll er die nächste zeile einlesen begin_f_loop(f,tf) ausführen die gerade eingelesenen koordinaten mit den im loop durchlaufenden koordinaten vergleichen und wenn die übereinstimmen die knotennummer abspeichern.
def fluentspezifische code sollte eigentlich funktionieren und mir ist auch klar dass ihr mir da nicht helfen könnt.
aber anscheinend klappt der teilbereich in dem die einzelnen zeilen im while nacheinander gelesen werden sollen nicht.
da nur die erste zeile gelsen wird und dann gleich abbricht.kann mir bitte wer sagen wo der fehler liegt?
sorry wenn der code geschribene ist das euch die haare zu berge stehen aber in den letzten wochen hab ich mir alles selber beigebracht und daher kann es leicht sein, dass ich gewisse "regeln" nicht einhalte. (woher soll ich sie auch kenne!?)
ich hoffe ihr könnt mir weiterhelfen.
eigentlich müsste es ja einfach sein zeilenweise die werte auszulesen aber es klappt nicht.mfg mooks
-
Du willst wohl die Funktion begin_f_loop ausführen (so sie denn existiert), aber was du hier machst, ist eine Funktionsdefinition mitten im Code. Du führst also an der Stelle nichts aus.
void begin_f_loop(double a,double b); //Funktionsprototyp/Deklaration (Bekanntmachen der Funktion) void begin_f_loop(double a,double b) { //Definition (den Inhalt der Funktion festlegen) //Anweisungen.... } //irgendwo später in einer Funktion (z.B. main): begin_f_loop(double a,double b); //Aufruf der Funktion
-
hallo!
begin_f_loop ist nicht das problem.
das programm ist zwar c aber wird mit fluent(cfd programm) kompiliert und daher muss ich keine funktionsdefinition machen.
begin_f_loop ist einer von vielen befehlen von fluent die problemlos funktionieren.der eigentliche fehler muss im c bereich darüber liegen im einlesen der variablen aus meiner txt.
wenn ich unter
sscanf(puffer,"%11d %E %E %E",&nodeNumber,&x,&y,&z);
eine message hinzufüge welche mir die werte nodenumber usw. zeigen soll dann wird beim programm nur einmal ein wert ausgegeben.
eigentlich müssten ja nacheinander alle werte dann angezeigt werden weil das while ständig einen loop machen sollte.
-
Du solltest Dateioperationen und Auswertung trennen, z.B. über eine entsprechende Funktion; außerdem hilft oft eine klare Definition der Datenstruktur, welche du verarbeiten willst; die u.g. Variante kommt auch mit mehreren NODE-Blöcken in deiner Datei klar:
typedef struct { int nr; double a,b,c; } Werte; typedef struct { int anzahl; Werte *werte; } Node; void verarbeiteNode(Node n) { int i=0; while( n.anzahl-- ) printf("%d %lf,%lf,%lf\n",n.werte[i].nr,n.werte[i].a,n.werte[i].b,n.werte[i].c),++i; } main() { Node n={0,0}; char *dateiname="bla.txt", zeile[200]; FILE *f=fopen(dateiname,"rt"); if( !f ) return perror(dateiname),1; while( fgets(zeile,sizeof zeile,f) ) { double d; if( strstr(zeile,"NODE") ) { if(n.werte) verarbeiteNode(n),free(n.werte),n.werte=0,n.anzahl=0; } else if( 4==sscanf(zeile,"%d,%lf,%lf,%lf",&d,&d,&d,&d) ) { n.werte=realloc(n.werte,++n.anzahl*sizeof(Werte)); sscanf(zeile,"%d,%lf,%lf,%lf",&n.werte[n.anzahl-1].nr,&n.werte[n.anzahl-1].a,&n.werte[n.anzahl-1].b,&n.werte[n.anzahl-1].c); } } if(n.werte) verarbeiteNode(n),free(n.werte),n.werte=0,n.anzahl=0; fclose(f); return 0; }
-
danke wutz!
"typedef struct" seh ich heute zum ersten mal aber ist wirklich praktisch!
mhm... muss mir deinen code mal genauer anschaun... will ihn zu 100% verstehen bevor ich ihn anwende. (man will ja auch was lernen beim arbeiten ;))
-
Neben anschauen hilft oft auch durchdebuggen, werte ist ein dynamisch wachsendes Array, wodurch du flexibel für beliebige Anzahlen von Wertezeilen eines Nodeblocks bist, d.h. du brauchst dich vorher nicht festlegen, wieviel Wertezeilen max. vorkommen.
Deine eigentliche Arbeit erledigt du dann ausschließlich in "verarbeiteNode".
-
Wutz schrieb:
Neben anschauen hilft oft auch durchdebuggen
und wenns ganz hart kommt auch denken. wo testest du ob dein realloc() erfolgreich war? das war mal so der erste bug der mir aufgefallen ist (davon dass du immer schön nach möglichkeit alles in ne zeile packst abgesehen)