Funkcija Fscanf ne čita uzastopne redove kao što je očekivano

Rezime

Kada je datoteka otvorena u režimu teksta, pokušaj čitanja redova teksta korišćenjem funkcije Fscanf možda neće uspeti i samo jedan red teksta će biti pročitan iz datoteke. Razgraničer je postavljen na "[^ \n]". Funkcija Fscanf se čita do, ali ne sadrži znak razgraničavanja. Zbog toga se tok datoteke zaustavlja u prvom "\n" u datoteci. Naredna Fscanf funkcija poziva neuspešno jer pokazivač datoteke ostaje u znaku razgraničavanja, a funkcija fscanf ne može da unapredi pokazivač funkcije koji je u prošlosti. Da biste pomerili pokazivač datoteke iznad znaka razgraničavanja, koristite jedan od sledeća dva metoda:

  • Ažurirajte kôd da biste koristili sljedeći Fscanf funkcijski poziv:

          fscanf(stream, "%[^\n]%*c", line)

    Odrednica formata "% * c" čita jedan znak iz toka ulaza, ali ga ne dodeljuje ni jednom od parametara u pozivu funkcije fscanf.

  • Pozovite Fgetc funkciju nakon poziva funkcije fscanf da biste pomerili pokazivač datoteke izvan znaka "\n".

Sledeći uzorak koda pokazuje ovaj problem. Uzorak koda bi trebalo da čita i odštampa redove iz tekstualne datoteke dok ne dostigne neku od njih. Međutim, uzorak koda čita samo prvi red iz datoteke. Pošto nije pronađen kraj znaka datoteke, uzorak koda se pokreće beskrajnom petlje ako tok datoteke sadrži znak "\n".

Uzorak koda

FILE *stream;char line[80];while ((fscanf(stream, "%[^\n]", line)) != EOF ){   printf("Line = %s \n",line);}

Sledeći primer koda pokazuje drugi gorenavedeni metod da bi rešio ovaj problem:

FILE *stream;char line[80];while ((fscanf(stream, "%[^\n]", line)) != EOF){   fgetc(stream);    // Reads in '\n' character and moves file                     // stream past delimiting character   printf("Line = %s \n", line);}

Potrebna vam je dodatna pomoć?

Unapredite veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Microsoft insajdere

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Izgleda da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×