2015-11-02 4 views
-1

У меня мало проблем с моим кодом. Я пытаюсь сделать цикл while, который будет считывать все мои входные значения, а затем останавливаться, когда я нажимаю EOF. Я прочитал, что EOF в Windows - это CTRL + Z и т. Д., Но мое «while» не хочет останавливаться и после всех входных значений и CTRL + Z остается и ждать следующих значений. Это мой код, и надеюсь, что вы поможете мне спасибо):Как я могу остановить считывание значений после EOF

#include <stdio.h> 
#include <stdbool.h> 

#define gc getchar 



inline int scan_integer(); 
inline void zaprzeczenie(bool*); 


int main() { 
    bool rosnie=true; 

    int poprzednia; 
    register int terazniejsza; 


    terazniejsza = scan_integer(); 
    poprzednia = terazniejsza; 

    int sumaAktualnego=terazniejsza; 
    int sumaNajwiekszego=terazniejsza; 

    int iloscAktualnego=1; 
    int iloscNajwiekszego=0; 

    int staly=1; 
    int sumaStalego=0; 


    while(!feof(stdin)) 
    { 
    printf("%d ",terazniejsza); 
    terazniejsza = scan_integer(); 


    if(terazniejsza<poprzednia){ 
     if(rosnie){ 
      if(iloscAktualnego>iloscNajwiekszego){ 
       iloscNajwiekszego=iloscAktualnego; 
       sumaNajwiekszego=sumaAktualnego; 
      } 
      iloscAktualnego=1; 
      sumaAktualnego=terazniejsza; 

      if(staly>1){ 
       iloscAktualnego+=staly; 
       sumaAktualnego+=sumaStalego; 
       staly=1; 
       sumaStalego=0; 
      } 

      zaprzeczenie(&rosnie); 
     } 
     else{ 
      sumaAktualnego+=terazniejsza; 
      iloscAktualnego++; 
     } 
    } 
    else if(terazniejsza>poprzednia){ 
     if(rosnie){ 
      sumaAktualnego+=terazniejsza; 
      iloscAktualnego++; 
     } 
     else{ 
      if(iloscAktualnego>iloscNajwiekszego){ 
       iloscNajwiekszego=iloscAktualnego; 
       sumaNajwiekszego=sumaAktualnego; 
      } 
      iloscAktualnego=1; 
      sumaAktualnego=terazniejsza; 

      if(staly>0){ 
       iloscAktualnego+=staly; 
       sumaAktualnego+=sumaStalego; 
       staly=1; 
       sumaStalego=0; 
      } 

      zaprzeczenie(&rosnie); 
     } 
    } 
    else if(terazniejsza==poprzednia){ 
     staly++; 
     sumaStalego+=poprzednia; 
     sumaStalego+=terazniejsza; 
     sumaAktualnego+=terazniejsza; 
     iloscAktualnego++; 
    } 

    poprzednia=terazniejsza; 
} 
    if(iloscAktualnego>iloscNajwiekszego){ 
     iloscNajwiekszego=iloscAktualnego; 
     sumaNajwiekszego=sumaAktualnego; 
    } 

    printf("%d %d",iloscNajwiekszego, sumaNajwiekszego); 
} 

inline int scan_integer() 
{ 
    register int c = gc(); 
    int wejsciowa = 0; 
    for(; ((c<48 || c>57)); c = gc()); 

    for(;c>47 && c<58; c = gc()) { 
     wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48; 
    } 
    return wejsciowa; 
} 

inline void zaprzeczenie(bool* boo){ 
    boo=!boo; 
} 

PS: Извините за полировать переменных)

+0

Пожалуйста, правильно отформатируйте свой код. –

+2

[Почему «while (! Feof (file))« всегда неправильно? »(Http://stackoverflow.com/q/5431941/1679849) –

+0

Необходимо проверить, когда' gc() 'возвращает' EOF'. – chux

ответ

1
#define gc getchar 

Пожалуйста, не делайте этого - это делает его более трудным для других, чтобы прочитать и понять ваш код.

while(!feof(stream)) не работает так, как этого ожидают многие люди, и будет слишком много крутиться. Вместо этого вам нужно проверить результат последней операции ввода. Поскольку вы используете getchar, вы можете проверить результат:

while ((terazniejsza = scan_integer()) != EOF) 
{ 
    ... 
} 

... 

inline int scan_integer() 
{ 
    register int c = gc(); 
    int wejsciowa = 0; 
    for(; ((c<48 || c>57) && c != EOF); c = gc()); 

    for(;c>47 && c<58 && c != EOF; c = gc()) { 
     wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48; 
    } 
    return c != EOF ? wejsciowa : c; 
}  
+0

Спасибо, но он все еще не работает ...« Пока »не хочет останавливать ожидания и кажется, что scan_ineger не хочет возвращать EOF или он не возвращает EOF ... –