所以我试图从一个循环中读取一个结构数组中的值。该文件具有一定的已知输入,因此每个我想将每个值分配给结构数组中的特定插槽。但是,每次我尝试运行它时,我都被告知循环行中的“在ROW之前的预期表达式”。
typedef struct information
{
char Poke[100];
char Type[100];
char Evo[100];
float Height;
float Weight;
int HP;
int Attack;
int Defense;
int SPA;
int SPD;
int Speed;
} ROW[100];
int main()
{
int i;
FILE *ifp;
//open file, set to ifp
while(!feof(ifp))
{
j++;
//Read and store all values
fscanf(ifp, "%s %s", ROW[j].Poke, ROW[j].Type);
fscanf(ifp, "%f %f", ROW[j].Height, ROW[j].Weight);
fscanf(ifp, "%i %i %i %i %i %i", &ROW[j].HP, &ROW[j].Attack,
&ROW[j].Defense,&ROW[j].SPA,&ROW[j].SPD,&ROW[j].Speed);
fscanf(ifp, "%s", &ROW[j].Evo[0]);
}
}
答案 0 :(得分:3)
您无法定义结构并在一个表达式中声明一个数组。你需要将两者分开,如下所示:
typedef struct information
{
char Poke[100];
char Type[100];
char Evo[100];
float Height;
float Weight;
int HP;
int Attack;
int Defense;
int SPA;
int SPD;
int Speed;
} ROW;
ROW rows[100];
然后在循环中使用rows
。
答案 1 :(得分:1)
添加到Andrew Medico的答案。更好的循环结构是:
for (j = 0;; )
{
ROW row;
int n_items = fscanf(ifp, "%100s %100s %f %f......",
row.Poke, row.Type, &row.Height, &row.Weight, ......);
if ( n_items == 11 )
rows[j++] = row;
else
break;
}
// at this point, the number of valid rows is j
另一点是,这种循环结构无法优雅地处理输入中有拼写错误的情况。最好将fscanf
行替换为:
char buffer[400]; // longer than the longest line
if ( ! fgets(buffer, sizeof buffer, ifp) )
break;
int n_items = sscanf(buffer, "%100s...........
这种设计更灵活,因为它允许您在执行sscanf
之前对线路进行一些检查。例如,您可以支持在行的开头使用#
字符表示应该跳过该行。