2016-11-04 2 views
5

a.cПочему мой внутренний цикл работает только один раз?

#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 

Я не понимаю, почему цикл for отлично работает, но цикл while запускается только один раз.

Результат выглядит

enter image description here

+0

может быть, вам нужно 'rewind'? –

+0

файл стать EOF. – BLUEPIXY

+0

Как вы определили, что цикл while был запущен только один раз? –

ответ

3

В первом запуске цикла for, весь файл привыкает, и вы никогда не сбросить его. Поэтому он будет успешно искать только символ 0x41.

Вам нужно сделать одну из этих двух операций после цикла while:

fseek(file, 0, SEEK_SET); 

rewind(file); 

Первый is preferred because of better error handling.

7

Читать man page для fgetc() (курсив мой)

fgetc() читает следующий символ из потока и возвращает его как беззнаковое полукокса гипсе к междунар или EOF в конце файла или ошибка.

Итак, когда петля while закончилась, она будет выходить один раз fgetc() возвращается EOF и он будет постоянно возвращаться EOF для всех последующих вызовов.

Вам необходимо сбросить указатель файла до начала потока (используя rewind() или fseek()), чтобы начать с самого начала.

Это говорит,

  • fgetc() возвращает int и char слишком коротка, чтобы хранить все возможное возвращаемое значение (например, сам EOF). Измените тип c на int.
  • Для размещенной среды int main() должен по крайней мере быть int main(void) в соответствии со стандартом.
+0

Добро пожаловать. Вы также можете [рассмотреть вопрос о принятии ответа, который помог вам] (http://meta.stackexchange.com/q/5234/244062). –

3

Это должно сделать работу для вас:

#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; 
} 
Смежные вопросы