错误将文件中的值读入结构数组

时间:2014-04-07 04:13:13

标签: c arrays file-io struct

所以我试图从一个循环中读取一个结构数组中的值。该文件具有一定的已知输入,因此每个我想将每个值分配给结构数组中的特定插槽。但是,每次我尝试运行它时,我都被告知循环行中的“在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]);
    } 
}

2 个答案:

答案 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之前对线路进行一些检查。例如,您可以支持在行的开头使用#字符表示应该跳过该行。