2016-04-01 9 views
0

にファイルの列を読む:(...質量、直径、密度)Iファイルからと同様テーブル読み取るための割り当て有する構造体

20個の値のカテゴリがある
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 
... 

を 9つの惑星。

私は(...質量、直径、密度)20のコンポーネントとstruct planetにデータを読み込むしようとしていると、それはコンパイルが、私は出力の構造成分のいずれかを印刷できない(等p[2].A )ので、私はファイルからデータを読み込んでいる(と私は間違いなく正しい場所に保存されているように)見えません。私はstructに列を読み込むしようとしているので、それは少し厄介だ...

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++; 
} 

...

誰もがこの方法の問題点を見ることができますか?

for (j = 0; j < 9; i++) 

あなたはjを比較したがiをインクリメントしている:

+0

データには、実際に最初の行の 'planet'または' name'タグが欠けていますか?あなたの構造のレイアウトは嫌です。空白は安価で使用する必要があります。構造要素の名前は不透明です。 'D '要素が' float'で他の要素がすべて 'char'であるのはなぜか分かりません。あなたは9の代わりに 'NUM_PLANETS'を持たなければなりません(Plutoが惑星として復活したことを知ることは興味深い)。どのようにカンマをスキップしているのかはわかりません。印刷を追加しましたか? –

+0

申し訳ありませんが、カンマは実際にはテーブルにはありません。要素D(密度)は、構造体をソートする値として使用されている唯一の要素であるため浮動小数点型です(テーブルを再印刷する必要がありますが、密度の降順で惑星を並べ替える必要があります)。要素の残りの部分は重要ではないので、私は文字列としてそれらを読んでいるので、私は新しい表でそれらを再印刷することができます。 私はソートして別のファイルにfprinftするためにすべてを書いていますが、私はまたまっすぐにそれをプリントアウトしようとしましたが、何も得ません。 – ari

+0

とはい、最初の行のラベルがありません – ari

答えて

0

あなたの当面の問題は、このループです。 j++を使用し、ループの本体を変更します。または、全体を通してiを使用してください。

for (j = 0; j < 9; j++) 
    { 
     if (fscanf(fp, "%s", p[j].A) != 1) 
     { 
      fprintf(stderr, "Failed to scan a planet name\n"); 
      return 1; 
     } 
     printf("Planet name: [%s]\n", p[j].A); 
    } 

あなたfor (i = 0; i < 20; i++)ループはあまりにも問題があります。

for (i = 0; i < 20; i++) 
    { 
     printf("Line %d\n", i+2); 
     if (fscanf(fp, "%s", label[i]) != 1) 
     { 
      fprintf(stderr, "Failed to read a label\n"); 
      return 1; 
     } 
     for (j = 0; j < 9; j++)     // this for loop reads values across the rows and assigns them to the labels 
     { 
      if (fscanf(fp, "%s", x[j]) != 1) 
      { 
       fprintf(stderr, "Failed to read value for %s\n", p[j].A); 
       return 1; 
      } 
      printf("Value: [%s] for %s\n", x[j], p[j].A); 
      if (i == 0) 
       strcpy(p[j].B, x[j]); 
      … 
     } 
     i++; 
    } 

あなたはiには、2つの増分を持っています。私が追加したエラーチェックに注意してください。

これは、6行と惑星の名前のデータセットの「作業中の」コードです。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

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; 
    int i = 0, j = 0; 
    planet p[9]; 
    char label[20][30]; 
    char x[20][30]; 
    const char filename[] = "planets.txt"; 

    fp = fopen(filename, "r"); 
    if (fp == NULL) 
    { 
     fprintf(stderr, "Failed to open file %s\n", filename); 
     return 1; 
    } 

    for (j = 0; j < 9; j++)      // this for loop read the planet names 
    { 
     if (fscanf(fp, "%s", p[j].A) != 1) 
     { 
      fprintf(stderr, "Failed to scan a planet name\n"); 
      return 1; 
     } 
     printf("Planet name: [%s]\n", p[j].A); 
    } 

    for (i = 0; i < 6; i++)     // this for loop counts the rows and reads the labels 
    { 
     printf("Line %d\n", i+2); 
     if (fscanf(fp, "%s", label[i]) != 1) 
     { 
      fprintf(stderr, "Failed to read a label\n"); 
      return 1; 
     } 
     printf("Label: [%s]\n", label[i]); 
     for (j = 0; j < 9; j++)     // this for loop reads values across the rows and assigns them to the labels 
     { 
      if (fscanf(fp, "%s", x[j]) != 1) 
      { 
       fprintf(stderr, "Failed to read value for %s\n", p[j].A); 
       return 1; 
      } 
      printf("Value: [%s] for %s\n", x[j], p[j].A); 
      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]); 
     } 
    } 

} 

(入力のエコーから)のサンプル出力:

Planet name: [MERCURY] 
Planet name: [VENUS] 
Planet name: [EARTH] 
Planet name: [MARS] 
Planet name: [JUPITER] 
Planet name: [SATURN] 
Planet name: [URANUS] 
Planet name: [NEPTUNE] 
Planet name: [PLUTO] 
Line 2 
Label: [Mass(10^24kg)] 
Value: [0.33] for MERCURY 
Value: [4.87] for VENUS 
Value: [5.97] for EARTH 
Value: [0.642] for MARS 
Value: [1898] for JUPITER 
Value: [568] for SATURN 
Value: [86.8] for URANUS 
Value: [102] for NEPTUNE 
Value: [0.0146] for PLUTO 
Line 3 
Label: [Diameter(km)] 
Value: [4879] for MERCURY 
Value: [12104] for VENUS 
Value: [12756] for EARTH 
Value: [6792] for MARS 
Value: [142984] for JUPITER 
Value: [120536] for SATURN 
Value: [51118] for URANUS 
Value: [49528] for NEPTUNE 
Value: [2370] for PLUTO 
Line 4 
Label: [Density(kg/m^3)] 
Value: [5427] for MERCURY 
Value: [5243] for VENUS 
Value: [5514] for EARTH 
Value: [3933] for MARS 
Value: [1326] for JUPITER 
Value: [687] for SATURN 
Value: [1271] for URANUS 
Value: [1638] for NEPTUNE 
Value: [2095] for PLUTO 
Line 5 
Label: [Gravity(m/s^2)] 
Value: [3.7] for MERCURY 
Value: [8.9] for VENUS 
Value: [9.8] for EARTH 
Value: [3.7] for MARS 
Value: [23.1] for JUPITER 
Value: [9] for SATURN 
Value: [8.7] for URANUS 
Value: [11] for NEPTUNE 
Value: [0.7] for PLUTO 
Line 6 
Label: [Escape_Velocity(km/s)] 
Value: [4.3] for MERCURY 
Value: [10.4] for VENUS 
Value: [11.2] for EARTH 
Value: [5] for MARS 
Value: [59.5] for JUPITER 
Value: [35.5] for SATURN 
Value: [21.3] for URANUS 
Value: [23.5] for NEPTUNE 
Value: [1.3] for PLUTO 
Line 7 
Label: [Rotation_Period(hours)] 
Value: [1407.6] for MERCURY 
Value: [-5832.5] for VENUS 
Value: [23.9] for EARTH 
Value: [24.6] for MARS 
Value: [9.9] for JUPITER 
Value: [10.7] for SATURN 
Value: [-17.2] for URANUS 
Value: [16.1] for NEPTUNE 
Value: [-153.3] for PLUTO 

プログラムはすべてが惑星名と主張したとき、MAL-形成されたループ制御を見つけるのは簡単でした。

関連する問題