新问题:我必须将文件中的数据读入结构数组,并且我的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++;
}
答案 0 :(得分:0)
编辑问题纯粹是装饰性的。你可以试试这个:
typedef struct runner_t {
// ...
} runner_t;
请注意,虽然在POSIX系统(如Mac OS X和Linux)上保留了_t
后缀。最好是使用_type
代替,或者根本不使用后缀。
虽然你的问题(编译错误)存在于其他地方。首先,您使用scanf()
代替fscanf()
。 scanf()
始终从stdin
流中读取并且没有FILE*
参数(因此当您尝试传递FILE*
作为第一个参数时,编译器会将其视为错误,因为它始终需要const char*
。)要从您自己的文件流中读取,您需要使用fscanf()
,它确实采用FILE*
参数。 E.g:
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
。你将它命名为fistname
。改变它。
最后,在printf()
中,您使用%d
作为格式说明符来打印bignum
。由于它是unsigned long
,因此您需要使用%lu
。
答案 1 :(得分:0)
您的结构代码没问题,如果您不相信,请参阅this。那个ideone.com代码片段只添加了这个主要功能,并且工作正常:
int main(void) {
runner_t foo;
printf ("sizeof foo is %zu\n", sizeof foo);
return 0;
}
请参阅http://sscce.org以获取有关如何避免针对疑问提出问题的良好建议......
编辑后:使用fscanf
,因为scanf
不会将FILE*
作为第一个参数(检查两者的文档)。始终检查任何scanf
系列的返回值
功能。同时检查fopen
的返回值是否有错误。
此外,在为&
fscanf
传递数组时,请勿使用%s
。数组的名称表示数组的地址,并且取&
的数组是没有意义的,并且是不允许的。例如:fscanf(ifile, "%s", runarray[i].state);
答案 2 :(得分: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;
}
在这里编译。