2016-11-04 23 views
5

A.cDlaczego moja wewnętrzna pętla działa tylko raz?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 

    int i, counter=0; 
    char c; 

    FILE *file=fopen("a.txt","r"); 

    for (i = 0x41 ; i < 0x45; i++) 
    { 
     printf("%c(%x) ",i ,i); 
     while ((c = fgetc(file)) != EOF) 
     { 
      if (i == (char) c) 
       counter++; 
     } 
     printf("%d\n", counter); 
     counter=0; 
    } 
    fclose(file); 
    return 0; 
} 

a.txt

AAABBBAAA 

Nie rozumiem dlaczego pętla for działa doskonale ale pętla while działa tylko raz.

Wyjście wygląda

enter image description here

+0

może trzeba 'rewind'? –

+0

plik staje się EOF. – BLUEPIXY

+0

W jaki sposób ustaliłeś, że pętla 'while' działa tylko raz? –

Odpowiedz

3

W pierwszym przebiegu pętli for cały plik zostanie zużyta, a ty nigdy go wyzerować. Tak więc tylko z powodzeniem szuka znaku 0x41.

Trzeba zrobić jedną z tych dwóch operacji po pętli while:

fseek(file, 0, SEEK_SET); 

rewind(file); 

Pierwszy is preferred because of better error handling.

7

Przeczytaj man page dla fgetc() (podkr)

fgetc() czyta następny znak ze strumienia i zwraca go jako rzutowanie unsigned char na int, lub EOF na końcu pliku lub błąd.

Tak, raz zabrakło pętla while będzie wyjść raz fgetc() powraca EOF i będzie wracać EOF dla wszystkich kolejnych połączeń.

Należy zresetować wskaźnik pliku na początek strumienia (przy użyciu rewind() lub fseek()), aby rozpocząć od nowa.

Powiedział,

  • fgetc() zwraca int i char jest zbyt krótki, aby przechowywać wszystko możliwej wartości zwracanej (np EOF sama). Zmień typ c na int.
  • Dla hostowanego środowiska, int main() powinien być co najmniej int main(void) zgodny z normą.
+0

Nie ma za co. Możesz także [rozważyć przyjęcie odpowiedzi, która ci pomogła] (http://meta.stackexchange.com/q/5234/244062). –

3

ten powinien wykonać zadanie dla Ciebie:

#include <stdio.h> 

int main(void) 
{ 

    int i, counter=0; 
    int c; 

    FILE *file=fopen("a.txt","r"); 

    for (i = 0x41 ; i < 0x45; i++) 
    { 
     printf("%c(%x) ",i ,i); 
     while ((c = fgetc(file)) != EOF) 
     { 
      if (i == c) counter++; 
     } 
     rewind(file); 
     printf("%d\n", counter); 
     counter=0; 
    } 
    fclose(file); 
    return 0; 
} 
Powiązane problemy