0

新问题:我必须将文件中的数据读入结构数组,并且我的 scanf 函数出现错误。我真的不确定扫描到结构的细节。这是我写的:

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

#define runnum 500
#define charnum 20

typedef struct {
        unsigned long bibnum;
        char lastname[charnum];
        char fistname[charnum];
        int grade;
        char team[charnum];
        char state[charnum];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[runnum]; 

    i = 0;

    while  (i < runnum)
        {
            scanf(ifile, "%ul", &runarray[i].bibnum);
            scanf(ifile, "%s", &runarray[i].lastname);
            scanf(ifile, "%s", &runarray[i].firstname);
            scanf(ifile, "%d", &runarray[i].grade);
            scanf(ifile, "%s", &runarray[i].team);
            scanf(ifile, "%s", &runarray[i].state);
            scanf(ifile, "%d", &runarray[i].time1);
            scanf(ifile, "%f", &runarray[i].time2);
        printf("%d %s %s %d %s %s %d:%f", runarray[i].bibnum, runarray[i].lastname, runarray[i].firstname, runarray[i].grade, runarray[i].team, runarray[i].state, runarray[i].time1, runarray[i].time2); 
        i++;
     }
4

3 回答 3

0
#include <stdio.h>
#include <string.h>
#include <math.h>

#define RUNNUM 500
#define CHARNUM 20

typedef struct {
        unsigned long bibnum;
        char lastname[CHARNUM];
        char firstname[CHARNUM];
        int grade;
        char team[CHARNUM];
        char state[CHARNUM];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[RUNNUM];

    for (i=0; i < RUNNUM; i++)
        {
            fscanf(ifile, "%lu", &runarray[i].bibnum);
            fscanf(ifile, "%s", runarray[i].lastname);
            fscanf(ifile, "%s", runarray[i].firstname);
            fscanf(ifile, "%d", &runarray[i].grade);
            fscanf(ifile, "%s", runarray[i].team);
            fscanf(ifile, "%s", runarray[i].state);
            fscanf(ifile, "%d", &runarray[i].time1);
            fscanf(ifile, "%f", &runarray[i].time2);
        printf("%lu %s %s %d %s %s %d:%f"
        , runarray[i].bibnum
        , runarray[i].lastname, runarray[i].firstname
        , runarray[i].grade, runarray[i].team
        , runarray[i].state
        , runarray[i].time1, runarray[i].time2);

     }
return 0;
}

在这里编译。

于 2013-10-27T19:51:55.900 回答
0

编辑器问题纯粹是装饰性的。你可以试试这个:

typedef struct runner_t {
    // ...
} runner_t;

请注意,_t后缀在 POSIX 系统(如 Mac OS X 和 Linux)上是保留的。最好要么_type改用,要么根本不使用后缀。

您的问题(编译错误)在别处。首先,您使用scanf()的是fscanf(). scanf()总是从stdin流中读取并且没有参数(因此当您尝试将 a作为第一个参数FILE*传递时,编译器会将其视为错误,因为它总是需要 a来代替。)要从您自己的文件流中读取,您需要使用,这确实需要一个论点。例如:FILE*const char*fscanf()FILE*

fscanf(ifile, "%lu", &runarray[i].bibnum);

注意:是%lu,不是%ul。)

另请注意,当您读取字符串时,即使它们已经是指针,您也会将指针传递给它们:

fscanf(ifile, "%s", &runarray[i].lastname);

由于runner_t.lastname已经是一个指针,只需按原样传递它:

fscanf(ifile, "%s", runarray[i].lastname);

runner_t.firstname此外,您在 struct 声明中拼写错误。你命名它fistname。也改变它。

最后,在您的printf(), 您%d用作格式说明符来打印bignum。既然是unsigned long, 你需要使用%lu.

于 2013-10-27T19:11:59.330 回答
0

您的结构代码很好,如果您不相信,请查看此内容。该 ideone.com 片段仅添加了这个主要功能,并且工作正常:

int main(void) {
  runner_t foo;
  printf ("sizeof foo is %zu\n", sizeof foo);
  return 0;
}

请参阅http://sscce.org以获取有关如何避免因问得不好的问题而被否决的好建议...


编辑后:使用fscanf, 因为scanfFILE*作为第一个参数(检查两者的文档)。scanf始终检查任何系列函数的返回值。还要检查错误的返回值fopen

&此外,在传递数组时不要使用fscanf %s. 数组名就是数组的地址,取&这个是没有意义的,也是不允许的。例如:fscanf(ifile, "%s", runarray[i].state);

于 2013-10-27T19:33:17.350 回答