1

So i am trying to read values into an array of structs, from a loop. The file has a certain know input, so each I want to assign each value to a specific slot in the array of structures. However, each time I try to run it, I am told that 'expected expression before ROW' in the lines of the loop.

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]);
    } 
}
1

2 Answers 2

3

You can't define a struct and declare an array in one expression like that. You need to split the two up, like this:

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];

Then use rows in your loop.

Sign up to request clarification or add additional context in comments.

Comments

1

Adding to Andrew Medico's answer. A better loop structure would be:

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

Another point is that this loop structure cannot gracefully handle the case where you have a typo in your input. It would be better to replace the fscanf line with:

char buffer[400];   // longer than the longest line
if ( ! fgets(buffer, sizeof buffer, ifp) )
    break;

int n_items = sscanf(buffer, "%100s...........

This design is more flexible in that it lets you do some checks on the line before doing sscanf. For example you could support having the # character at the start of a line to mean that the line should be skipped.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.