C Lees tot het einde van het bestand

Ik heb momenteel code die 4 regels leest en ik wil dat kunnen veranderen tot EOF of mijn MAX constante waarde. Ik kan het! EOF niet goed laten werken en vroeg me af hoe ik mijn code zou veranderen om dit te bereiken?

Bij voorbaat dank

#include 

struct record{
    char name[2];
    int arrival_time;
    int job_length;
    int job_priority;
};

const int MAX = 40;

int main(void)
{
    struct record jobs[MAX];
    int i = 0;
    int j;
    FILE *f = fopen("data.dat","rb");

    while (fscanf(f, "%s %d %d %d", &jobs[i].name, &jobs[i].arrival_time,
                  &jobs[i].job_length, &jobs[i].job_priority) == 4 && i < MAX)
      i++;

    for (j = 0; j < i; j++)
        printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time,
               jobs[j].job_length, jobs[j].job_priority);

    fclose(f);

    return(0);
}
3
Het lijkt vreemd om fscanf te gebruiken voor een bestand dat in de binaire modus is geopend. fscanf met een niet-gekwalificeerde "% s" -indeling is inherent onveilig tenzij u volledige controle hebt over wat er in het invoerbestand staat; het leest een wit begrensd woord van willekeurige lengte dat uw array kan overlopen. Uw beëindigingsvoorwaarde, die de waarde controleert die wordt geretourneerd door fscanf , lijkt correct te zijn; als je 4 gegevensvelden op elke invoerregel hebt, zou het moeten werken. Kunt u ons laten zien hoe data.dat eruit ziet?
toegevoegd de auteur Keith Thompson, de bron
Als u tot EOF wilt lezen en het totale aantal regels van het bestand data.dat niet kent, moet u rekening houden met dynamische opslag voor de struct jobs (een malloc en een aantal realloc totdat het einde van het bestand is bereikt).
toegevoegd de auteur Nicolás, de bron
Mijn data.dat ziet er zo uit als deze A1 3 3 3 op één regel en dan B1 4 4 4 enzovoort
toegevoegd de auteur Intelwalk, de bron

3 antwoord

Zoiets als

while (fscanf(f, "   %s   ", &etc) != EOF) {

}

Gebruik vervolgens feof (f) om te controleren of het een fscanf -fout of eigenlijk EOF was.

5
toegevoegd
Hij heeft al controleren of fscanf retourneert 4 (het aantal items gevraagd); het zou tot 40 reeksen punten moeten lezen.
toegevoegd de auteur Keith Thompson, de bron

Je code lijkt te doen wat je wilt, behalve:

char name[2];

Namen zullen waarschijnlijk langer zijn dan 1 teken.

FILE *f = fopen("data.dat","rb");

U lijkt tekst te lezen ( "r" ) bestand, niet binair ( "rb" ).

&jobs[i].name should be jobs[i].name

2
toegevoegd

You need to change the order of the tests in your while() loop - you must test i < MAX before calling fscanf(), or else you'll potentially call it one too many times (you should also be passing jobs[i].name without the & to fscanf):

while (i < MAX && fscanf(f, "%s %d %d %d", jobs[i].name, &jobs[i].arrival_time,
              &jobs[i].job_length, &jobs[i].job_priority) == 4)
1
toegevoegd