[C] Koordinaten aus .txt einlesen

Lord_Brainbug

Grünschnabel
Hallo Allerseits,

das hier ist mein erster Post, daher bitte ich um Nachsicht, falls ich bestehende Formatierungsregeln noch nicht kenne.

Ich programmiere in C. Ziel ist es die Knotenpunkte eines Bauteils aus einer Textdatei einzulesen, um diese später verändern zu können.

Das Textdokument hat den folgenden Aufbau:

3 5 4 30 0 #Programmname
1 6 0.000000E+000 0.000000E+000 0.000000E+000
2 6 2.000000E+000 0.000000E+000 0.000000E+000
3 6 0.000000E+000 2.000000E+000 0.000000E+000
4 6 0.000000E+000 1.000000E+000 0.000000E+000
5 6 1.000000E+000 0.000000E+000 0.000000E+000
1 2
3 4
2 2
1 4
3 2
1 5
4 2
2 5

Die erste Zeile möchte ich ignorieren.
In Zeilen 2 - 6 stehen in Spalte 3 - 5 meine X-, Y- und Z-Koordinaten, diese möchte ich einlesen um damit später zu arbeiten.
Die Restlichen Zeilen geben den Aufbau der Elemente an, diese möchte ich ebenfalls ignorieren.

Ich bin so weit, dass ich das ganze in ein Double-Array einlesen kann (Wenn ich den Dateinamen in Zeile 1 händisch vorher entferne) und dann die einzelnen Werte in diesem Array aufrufe. Allerdings funktioniert das nur für genau diese Struktur, für größere Strukturen müsste ich das neu anlegen.

Ich suche also nach einer Schleife, die ein Array für mich füllt.


Mein Code bis jetzt (Dateiname händisch entfernt und zum test gebe ich die zu verwendenden Werte auf die Konsole aus):

C:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
FILE *f_from;
int i;
double dtest[1000];

f_from = fopen("structure_test.txt", "r");
if(f_from == NULL) {printf("Datei 1 konnte nicht geoeffnet werden.\n");
                    exit(1);}

     for(i=0;i<100;i++)
     fscanf(f_from,"%lf", &dtest[i]);

printf("%lf\n%lf\n%lf\n", dtest[7], dtest[8], dtest[9]);
printf("%lf\n%lf\n%lf\n", dtest[12], dtest[13], dtest[14]);
printf("%lf\n%lf\n%lf\n", dtest[17], dtest[18], dtest[19]);
printf("%lf\n%lf\n%lf\n", dtest[22], dtest[23], dtest[24]);
printf("%lf\n%lf\n%lf\n", dtest[27], dtest[28], dtest[29]);

fclose(f_from);

return(0);


Später sollte man die Größe des Arrays via Malloc/Calloc einstellen (dazu gibt es einiges online, das sollte ich hinbekommen), mir geht es erstmal um das auslesen der Koordinaten.

Vielen Dank
Brainbug
 

cwriter

Erfahrenes Mitglied
Vielen Dank
Brainbug
Sorry, was war die Frage?
Die Problembeschreibung, das Dateiformat und den gewünschten Effekt hast du ja vorbildlich beschrieben, aber was fehlt dir denn noch?

Ich schätze mal, du liest einfach alle Werte ein, die du nicht immer brauchst?

Dazu kannst du fscanf() ein bisschen erweitern:
C:
int count = fscanf(f_from, "%d %d %lf %lf %lf", &s1, &s2, &s3, &s4, &s5);
//Dann einfach die Werte von s3-s5 entsprechend abspeichern, falls count==5 ist (count beinhaltet die Anzahl der tatsächlich gelesenen Werte)
Die erste Zeile (falls du sie wieder in die Datei nimmst) kannst du mit
C:
fscanf(f_from, "%[^\n]", buf); //buf ist ein genügend grosser char* (array). %[^\n] heisst: Lies alles, was nicht '\n' (also der Zeilenbegrenzer) ist, in den Buffer.
überspringen.

Ich programmiere in C.
Sag bitte C99 :eek:

Später sollte man die Größe des Arrays via Malloc/Calloc einstellen (dazu gibt es einiges online, das sollte ich hinbekommen), mir geht es erstmal um das auslesen der Koordinaten.
Ja, hatten wir hier im Forum auch ein paar Mal. Aber du kriegst das schon hin. Ansonsten einfach fragen :)

Gruss
cwriter
 

Lord_Brainbug

Grünschnabel
Vielen Dank

Ich löse das nun so

C:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
FILE *f_from;
int i;
int w;
double dtest[1000];
double s1, s2, s3, s4, s5;
char buf[100];

f_from = fopen("structure_test.txt", "r");
if(f_from == NULL) {printf("Datei 1 konnte nicht geoeffnet werden.\n");
                    exit(1);}

fscanf(f_from, "%[^\n]", buf);
for(i=0;i<13;i++)
{
    fscanf(f_from, "%d %d %lf %lf %lf", &s1, &s2, &s3, &s4, &s5);
    dtest[i]=s3;
    i=i+1;
    dtest[i]=s4;
    i=i+1;
    dtest[i]=s5;
}
for(w=0;w<15;w++)
{
    printf("%lf\n", dtest[w]);
}
fclose(f_from);   

return(0);
}