2012-01-18 41 views
5

Mam pytanie dotyczące fgets i fscanf w C. Jaka jest dokładnie różnica między tymi dwoma? NpRóżnica między fgets i fscanf?

char str[10]; 
while(fgets(str,10,ptr)) 
{ 
counter++; 
... 

i drugim przykładzie

char str[10]; 
while(fscanf(ptr,"%s",str)) 
{ 
counter++; 
... 

gdy o pliku tekstowego zawierającego łańcuchy, które są oddzielone przez pustą przestrzeń, np AB1234 AC5423 AS1433. W pierwszym przykładzie "licznik" w pętli while nie daje takiego samego wyniku jak w drugim przykładzie. Po zmianie "10" w funkcji fgets, licznik zawsze podaje inne wyniki. Jaki jest tego powód? Czy ktoś może również wyjaśnić, co dokładnie robi fscanf, jak długi jest ciąg w każdej pętli while?

Odpowiedz

5

Funkcja fgets czyta do nowej linii (a także przechowuje ją). fscanf ze specyfikatorem %s odczytuje aż do pustego miejsca i nie przechowuje go ...

Na marginesie, nie określasz rozmiaru bufora w scanf i jest to niebezpieczne. Wypróbuj:

fscanf(ptr, "%9s", str) 
+0

Dzięki za odpowiedź, czy jest to podobne również w przypadku fputs i fprintf? Albo jaka jest między nimi różnica? – phpheini

+0

Nie, te są różne. Na przykład '% s' nie zatrzymuje się na pustych w printf. Przeczytaj instrukcję. – cnicutar

3

fgets czyta do nowej linii. fscanf tylko odczytuje białe znaki.

1

fgets przeczytaj całą linię. fscanf z %s odczytać ciąg, oddzielony spacją (lub \ n, \ t, itd ...). W każdym razie nie powinieneś ich używać, chyba że masz pewność, że tablica, którą czytasz, jest wystarczająco duża, aby pomieścić dane wejściowe. Napisałeś When changing the "10" in the fgets function the counter will always give different results. Pamiętaj, że fgets i scanf nie wiedzą ile bajtów przeczytać. powinieneś im powiedzieć. zmiana "10" po prostu powiększa bufor, do którego zapisują te funkcje.

1

W twoim przykładzie fgets odczyta maksymalnie do 9 znaków ze strumienia wejściowego i zapisze je na str wraz z terminatorem 0. Nie pominie wiodących białych znaków. Zatrzyma się, jeśli zobaczy znak nowej linii (która zostanie zapisana pod numerem str) lub EOF przed maksymalną liczbą znaków.

fscanf ze specyfikacją %s konwersji będzie pominąć żadnej wiodącej spacje, a następnie odczytać wszystkie znaki nie-białych znaków, zapisując je do str następnie 0 Terminator. Zatrzyma czytanie przy następnym znaku odstępu lub EOF. Bez jawnej szerokości pola odczyta ona tyle znaków, które nie są spacjami, tak jak w strumieniu, potencjalnie przekraczając bufor docelowy.

Wyobraźmy sobie, że strumień wejściowy wygląda następująco: "\t abcdef\n<EOF>". Jeśli używałeś fgets, aby go przeczytać, str zawierałby "\t abcdef\n\0". Jeśli użyłeś fscanf, str może zawierać "abcdef\0" (gdzie \0 wskazuje 0 terminator).