Newsgroup: it.comp.lang.c
Titolo: uscire da ciclo infinito...

...premendo un tasto.
Sono 10 anni che non metto piu' mani sul
C ma ora mi ritrovo a dovermele "risporcare"
So che e' banale. So che la domanda viene
postata una volta ogni due giorni almeno.
So che probabilmente e' nelle FAQ ma non
le ho trovate...
Mi ricordo che lo facevo con un trucco
tipo getch e/o compagnia, ma al momento
non me lo ricordo (e getch e/o compagnia
non ne vogliono sapere).
cose del tipo:
fseek(stdin, 0, SEEK_END);
while (feof(stdin))
   { codice }
non ne vuole sapere neanche lui... (esce subito)
qualche altra idea?
TIA
maitre Aliboron

maitre Aliboron wrote:

Non saprei comunque prova a fare un fflush() su stdin prima del fseek...
Ma usare la scanf no?
-- 
daniele_athome

forse questo può andare bene:
while (EOF != getch()) {
	// codice...
}
questo esce quando sulla console premi Ctrl+Z, che manda l'End-Of-File.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Ah gia` e` vero non ci avevo pensato....
-- 
daniele_athome

Vi ringrazio per le risposte.
Il pb col codice sopra (e anche con lo scanf)
e' che il prg si arresta al getch o allo scanf,
ad ogni ciclo.
A me occorre uscire dal ciclo in maniera asincrona,
ad un punto imprecisato del ciclo, soprattutto
mentre il ciclo infinito e' in esecuzione ininterrotta.
Ho dato un'occhiata alle faq inglesi e mi sembra
di avere capito che non esiste un modo standard
(e in piu' anche li' e' suggerito il getch che sembra
non fare al caso mio)
Il modo piu' stupido che mi viene in mente
adesso e' quello di eseguire un fork/exec al
mio codice che esegue il ciclo infinito e il main lo
lascio bloccato sull'evento getch. All'uscita del
getch, killo il ciclo infinito.
Ma mi pare troppo complicata come soluzione. Mi
ricordo che gestivo questi piccoli trucchetti con
un piccolo controllo dentro un while, ma si tratta
di anni fa'.
Se nel frattempo avete qualche idea piu' semplice...
maitre Aliboron

d'accordo, il mio problema e' che non voglio
che il ciclo si arresti nella valutazione di
(espressione), che deve comportare
un input da tastiera.
La soluzione che ho trovato (e che mi
sembra di ricordare, utilizzavo spesso)
passa attraverso la funzione kbhit()
definita nel Borland C in <conio.h>.
while (!kbhit()) { ciclo infinito }
La funzione ritorna 1 se e'stato premuto
un tasto, zero altrimenti. Peccato che
non e' standard (ho l'impressione che
utilizzi le funzioni BIOS del DOS, ma
non ci giuro).
Grazie a tutti e a risentirci.
maitre Aliboron

maitre Aliboron wrote:

MMh... kbhit non puoi comunque usarla perche` sei in modalita` protetta...
Quello che puoi fare e` controllare in qualche modo il descrittore stdin,
magari con select() se devi gestire un timeout oppure qualche funzione per
verificare se ci sono byte da recuperare o no....
ciao!
-- 
daniele_athome

 fseek...
Eresia ;)
fflush(stdin) è un undefined behaviour.
Luca
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

 Luca
In che senso?
-- 
daniele_athome

 ha scritto:

fflush() forza la scrittura di tutti i dati bufferizzati. Ha invocarlo
su uno stream di input[1]?
Quotando lo standard:
7.19.5.2 The fflush function
[...]
Description
2) If stream points to an output stream or an update stream in which the
most recent operation was not input, the fflush function causes any
unwritten data for that stream to be delivered to the host environment
to be written to the file; otherwise, the behavior is undefined.
L'unico modo portabile (e funzionante...) per svuotare uno stream di
input line-buffered (in particolare lo stdin) e` il famigerato ciclo con
getchar():
while(getchar() != '\n')
        /* Nothing */;
(magari con il controllo di EOF)
Luca
[1] Hint: No.
-- 
Home: 
http://kronoz.cjb.net
Il coraggio non mi manca.
E` la paura che mi frega...

Kronos wrote:

Ho capito... grazie della spiegazione :)
ciao!
-- 
daniele_athome