Io in genere non testo mai in loop feof. Basta infatti testare se fgets ritorna NULL perché in quel caso vuol dire errore di I/O oppure end-of-file. Poi alla fine del ciclo puoi, se ti serve, anche differenziare tra errore e eof.

Visto che hai 4 righe "logicamente" raggruppate, le gestisci appunto con uno stato 0 1 2 3. Dopo il 3 si riazzera lo stato e si riparte. Se per caso alla fine del file ti trovi in uno stato diverso da 0, allora potresti anche stabilire che il file è ciucco ...

Quindi (codice abbreviato):

codice:
int stato = 0;

while (fgets (......) != NULL)
{
    switch (stato)
    {
        case 0:.....
            .....
        case 1:.....
            .....
    }

    if (++stato == 4)
    {
        /* tua funzione di inserimento */
        stato = 0;
    }
}

if (stato != 0)
    /* il file è ciucco */
....
Nota ancora una cosa: fgets inserisce nel buffer, se c'è spazio e la linea è più corta del buffer, il carattere '\n'. Sarebbe meglio toglierlo di mezzo visto che metti le stringhe in una struttura.