Ich habe einen Auftrag aus einer Datei ähnlich eine Tabelle zu lesen:Lesespalten aus einer Datei in eine Struktur
MERCURY VENUS EARTH MARS JUPITER SATURN URANUS NEPTUNE PLUTO
Mass(10^24kg) 0.33 4.87 5.97 0.642 1898 568 86.8 102 0.0146
Diameter(km) 4879 12104 12756 6792 142984 120536 51118 49528 2370
Density(kg/m^3) 5427 5243 5514 3933 1326 687 1271 1638 2095
Gravity(m/s^2) 3.7 8.9 9.8 3.7 23.1 9 8.7 11 0.7
Escape_Velocity(km/s) 4.3 10.4 11.2 5 59.5 35.5 21.3 23.5 1.3
Rotation_Period(hours) 1407.6 -5832.5 23.9 24.6 9.9 10.7 -17.2 16.1 -153.3
...
, wo es 20 Kategorien von Werten (Masse, Durchmesser, Dichte ...) und 9 Planeten.
Ich versuche, die Daten in eine struct planet
mit den 20 Komponenten (Masse, Durchmesser, Dichte ...) einzulesen und kompiliert, aber ich kann keine der Strukturkomponenten in der Ausgabe (wie p[2].A
) so sieht es nicht so aus, als würde ich sogar die Daten aus der Datei einlesen (und ich habe sie definitiv an der richtigen Stelle gespeichert). Weil ich versuche, Spalten in den struct
zu lesen, ist es ein bisschen chaotisch ...
typedef struct {char A[30]; char B[10]; char C[10]; float D; char E[10]; char F[10]; char G[10]; char H[10]; char I[10]; char J[10]; char K[10]; char L[10]; char M[10]; char N[10]; char O[10]; char P[10]; char Q[10]; char R[10]; char S[10]; char T[4]; char U[4];}planet;
int main(void) {
FILE * fp;
FILE * fs;
int i=0, j=0;
planet p[9];
char label[20][30];
char x[20][30];
fp=fopen("planets.txt", "r");
if (fp==NULL)printf("ERROR\n");
for(j=0; j<9; i++){ //this for loop read the planet names
fscanf(fp, "%s", p[i].A);
}
for(i=0; i<20; i++){ //this for loop counts the rows and reads the labels
fscanf(fp, "%s", label[i]); //label[0] corresponds to .B values
for(j=0; j<9; j++){ //this for loop reads values across the rows and assigns them to the labels
fscanf(fp, "%s", x[j]);
if (i==0)strcpy(p[j].B, x[j]);
else if (i==1) strcpy(p[j].C, x[j]);
else if (i==2){
p[j].D=atof(x[j]);
}
else if (i==3) strcpy(p[j].E, x[j]);
else if (i==4) strcpy(p[j].F, x[j]);
else if (i==5) strcpy(p[j].G, x[j]);
else if (i==6) strcpy(p[j].H, x[j]);
else if (i==7) strcpy(p[j].I, x[j]);
else if (i==8) strcpy(p[j].J, x[j]);
else if (i==9) strcpy(p[j].K, x[j]);
else if (i==10) strcpy(p[j].L, x[j]);
else if (i==11) strcpy(p[j].M, x[j]);
else if (i==12) strcpy(p[j].N, x[j]);
else if (i==13) strcpy(p[j].O, x[j]);
else if (i==14) strcpy(p[j].P, x[j]);
else if (i==15) strcpy(p[j].Q, x[j]);
else if (i==16) strcpy(p[j].R, x[j]);
else if (i==17) strcpy(p[j].S, x[j]);
else if (i==18) strcpy(p[j].T, x[j]);
else if (i==19) strcpy(p[j].U, x[j]);
}
i++;
}
...
Kann jemand ein Problem mit dieser Methode sehen?
Fehlt den Daten wirklich das Tag 'planet' oder' name' aus der ersten Zeile? Ihr Layout Ihrer Struktur ist abscheulich; Leerzeichen ist billig und sollte verwendet werden. Die Namen der Strukturelemente sind opak. Es ist nicht klar, warum Element 'D' ein' float' ist, wenn alle anderen 'char' sind. Sie sollten ein 'NUM_PLANETS' anstelle von 9 haben (es ist interessant zu sehen, dass Pluto wieder zu einem Planeten wurde). Mir ist nicht klar, wie du Kommas überspringst. Hast du Drucken hinzugefügt? –
Entschuldigung, die Kommas sind nicht wirklich in der Tabelle, ich habe es einfach so eingegeben, um Dinge zu trennen. Element D (Dichte) ist ein Gleitkommawert, da es das einzige Element ist, das als Wert verwendet wird, um die Strukturen zu sortieren (ich muss die Tabelle neu drucken, aber mit den Planeten, die nach absteigender Dichte geordnet sind). Der Rest der Elemente spielt keine Rolle, also lese ich sie als Strings, damit ich sie in der neuen Tabelle nachdrucken kann. Ich habe alles zu sortieren und fprinft in eine andere Datei geschrieben, und ich habe auch versucht, es einfach geradeaus zu drucken, aber nichts – ari
und ja, es fehlt ein Etikett für die erste Zeile – ari