2012-03-21 75 views
0
#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; 
} 

这个getdata函数是从一个文件读取数据到结构数组。第一行包含名字,下一行包含元素数字的基数值剩下的数字就是分数,这会重复8次。 getdata函数只读取前3行数据,包括名字2其他行当我尝试放(缓冲区)为什么我得到这个问题任何人都可以告诉我如何解决它?我有任何逻辑错误?一个结构的getdata函数没有读取所有数据

这是数据:

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. 我给你这一个,因为你是刚刚开始。在您的sscanf调用中要读取分数线,每个参数都必须作为指针传递,您传入的用于接收数据的第二个变量没有正确传递,而是使用“& skater [i] .baseval”。去你的玩家的名字sscanf

  3. 你需要再次调用fgets,可能在你的“for(k”循环中,因为你只是试图读你的标题行。 - 使用相同的缓冲区r数据(标题行)在尝试解析分数线时。

  4. 你需要在你的“for(j”循环中分开你的sscanf,在你的“(k”循环中产生一个新的sscanf,你将不得不阅读与分数分开的玩家数和baseval因为你有一个可读数的分数(COLUMN_SCORE)。

+0

谢谢,我现在正在工作 – KhoaVo 2012-03-21 07:23:52

相关问题