2012-03-21 7 views
0
この函機能名を含むstructure.The最初の行のアレイにファイルからデータを読み取ることである
#include <stdio.h> 
#include <stdlib.h> 

#define MAX 20 
#define MAX_BASE 8 
#define ROW 9 
#define COLUMN_SCORE 12 
#define MAX_SKATER 4 

typedef struct{ 
       char name[MAX]; 
       int elements; 
       float baseval[MAX_BASE]; 
       int score[12][MAX_BASE]; 
       double total_score; 
       }SKATER; 

int getData(SKATER skater[MAX]); 
//void calcData(SKATER skater[MAX]); 


int main (void) 
{ 
    // Global Declarations 
    SKATER skater[MAX_SKATER]; 
    int num; 

    // Function calls 
    num = getData(skater); 
    //calcData(skater); 
    return 0; 
} 

/********************************* getData ************************************ 
Pre: 
Post: 
*/ 
int getData(SKATER skater[MAX_SKATER]) 
{ 
    // LOcal Declarations 
    FILE* fpIn; 
    int i = 0; 
    int k; 
    int j; 
    char buffer[100]; 

    // Statements 
    if((fpIn = fopen("lab6data.txt","r"))==NULL) 
    { 
     printf("File opening error"); 
     system("PAUSE"); 
     exit(100); 
    } 

    while(i < MAX_SKATER && fgets(buffer, 100, fpIn)) 
    { 
     sscanf(buffer,"%*c%19[^]", skater[i].name); 
     puts(buffer); 
     for(k = 0; k < MAX_BASE; k++) 
     { 
      sscanf(buffer,"%d %f", &skater[i].elements, skater[i].baseval); 
      for(j = 0; j < COLUMN_SCORE; j++) 
      { 
       sscanf(buffer,"%d", &skater[i].score[k][j]);     
      } 
     } 

     i++; 
    } 
     system("PAUSE"); 
    fclose(fpIn); 
    return i; 
} 

、次の行は要素がベース値に番号を含むすべてのデータを読み取るされていません数字の残りの部分がスコアですが、これは8回繰り返されます。 getdata関数は、puts(バッファ)を試してみると、名前2の他の行を含むデータの最初の3行だけを読み込みます。なぜこの問題が発生するのですか?論理的なエラーがありますか?それは私が唯一あなたが間違っているかについていくつかのヒントを与える宿題があるので函関数は

MENS SHORT PROGRAM//http://www.isufs.org/results/owg2006/OWG06_Men_SP_Scores.pdf 
LYSACEK Evan 
1 7.5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 
2 10.0 1 2 2 1 1 1 1 2 0 1 1 1 
3 3.0 1 2 2 2 1 0 1 2 1 1 1 2 
4 3.1 1 1 1 1 1 0 0 0 1 0 1 0 
5 1.7-3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 
6 2.1 0 0 1 1 1 1 1 1 1 1 1 1 
7 3.1 0 0 1 1 0 0 1 1 1 1 1 1 
8 3.5 0 1 1 2 1 1 1 1 1 1 0 1 
WEIR Johnny 
1 7.5 2 2 2 2 1 1 1 1 1 2 1 1 
2 10.0 1 1 1 1 2 0 1 1 1 1 2 1 
3 3.0 1 1 1 2 1 0 1 1 2 2 2 2 
4 3.1 1 2 1 2 1 1 0 0 2 1 1 0 
5 5.5 0 -1 0 -1 -1 0 -1 -1 1 -2 -2 -2 
6 1.3 1 1 1 2 1 1 1 0 1 1 1 2 
7 3.1 0 1 1 1 1 0 0 1 2 1 1 1 
8 3.0 -1 1 1 2 1 0 1 0 2 1 -1 1 
PLUSHENKO Evgeni 
1 13.0 0 2 1 1 1 0 1 0 1 1 1 1 
2 7.5 1 2 2 2 2 1 2 1 2 2 2 2 
3 6.0 2 1 1 1 1 0 0 2 1 2 1 2 
4 2.3 2 1 1 1 1 1 2 1 1 1 1 1 
5 3.4 2 2 2 2 1 2 3 3 2 3 2 1 
6 2.1 1 1 1 2 2 0 0 0 1 2 1 1 
7 3.1 1 0 2 2 1 1 1 2 2 2 2 1 
8 3.5 1 1 2 2 1 1 1 1 2 2 1 1 
SAVOIE Matthew 
1 3.0 0 0 0 1 0 0 0 0 0 0 0 -1 
2 7.5 1 2 2 1 1 1 1 1 1 1 2 2 
3 9.5 0 1 1 0 0 0 0 0 0 0 1 1 
4 3.1 1 1 1 1 1 1 0 0 1 1 0 0 
5 1.9 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 
6 2.1 0 0 1 0 1 0 0 1 1 1 1 1 
7 3.1 0 0 1 0 0 0 1 1 2 0 2 1 
8 3.0 0 0 1 1 1 0 1 1 1 1 1 1 

答えて

0

この

はデータです。私はこれが正しい軌道に戻ってくれることを願っています! :)

  1. あなたは、あなたが限られた数の行だけを読んでいると言います。それはあなただけの行の数を印刷している理由を参照するには、「(私< MAX_SKATER & &のfgets(ながら、」あなたは、あなたのループ状態になっているはずです。

  2. をちょうど始めているので、私はあなたにこの1を与えます。スコアラインで読み込むsscanf呼び出しでは、すべてのパラメータをポインタとして渡す必要があります。データを受け取るために渡す2番目の変数が正しく渡されません。代わりに "& skater [i] .baseval"を使用してください。あなたのプレーヤー名のsscanfに行きます。

  3. "for(k"ループ)の中で、おそらくfgetsを再度呼び出す必要があります。同じバフを使ってrデータ(ヘッダーライン)をスコアラインの解析に使用します。

  4. あなたの "for(j"ループ)の中でsscanfを分離する必要があります。その結果、 "for(k"ループ)に新しいsscanfが生成されます。プレイヤー番号とbasevalをスコア(COLUMN_SCORE)のスコアが可変であるため、

+0

ありがとうございます – KhoaVo