|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
C++ e EOF in Windows
Ciao raga!
Avrei una domandina riguardo 'sto benedetto EOF. Ho un programmino C++ tipo questo: cout << "Premi Enter per cominciare"; while (valore = cin.get() !=EOF) { cout << "Inserire valore"; cin >> valore; cout << "Inserire valore2"; cin >> valore2; calcolo dei valori; } cout "Messaggio uscita"; Il problema sorge dal fatto che se inserisco EOF per uscire, il programma passa comunque dal ciclo, calcolando di nuovo i vari valori, invece di uscire subito dal ciclo, lasciando quindi i valori come sono. C'e' qualcosa che sbaglio o e' una cosa normale e in tal caso come potrei fare per uscire subito dal ciclo mantenendo comunque l'while? Grazie a tutti!
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
beh valore deve comunque prendere un nuovo valore, se no come comunichi al programma di uscire dal loop?
while ... { cout << "Inserire valore"; cin >> valore; if (valore = cin.get() !=EOF) { cout << "Inserire valore2"; cin >> valore2; calcolo dei valori; } } |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
Quote:
Ciao kk3z e grazie tante della risposta. Cosa intendi per nuovo valore? La comunicazione di uscire dal programma vienne proprio dall'inserimento nella variabile del valore EOF. Nel tuo esempio se usi if ... non rendi while inutile?
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
|
![]() |
![]() |
![]() |
#4 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Re: C++ e EOF in Windows
Ciao.
Giusto un warning: l'espressione: Codice:
valore = cin.get() != EOF Codice:
(valore = cin.get()) != EOF Codice:
valore = (cin.get() != EOF) [EDIT] Anzi: vediamo un po'... ... la prima volta premi Invio, quindi cin.get() restituisce '\n', quindi valore viene messo a 1 e il while viene eseguito... OK... ... idem finché devi inserire coppie di valori... ... uhm... forse ho capito: mi sa che cin >> rimette il newline di fine linea sullo standard input dopo aver letto il valore che gli hai dato, quindi quando esegui il controllo sulla condizione del while, cin.get() legge un newline e non un EOF. Prova a finire il while così: Codice:
// calcolo dei valori while (cin.get() != '\n') ; [/EDIT]
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 24-05-2004 alle 17:17. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
Re: Re: C++ e EOF in Windows
Quote:
Mi sa che hai colto proprio nel segno. Facendo il debug del programma ho visto che la variabile usato nel while assume stranamente il valore 1 quando si usa EOF. Usando il tuo metodo e digitando EOF ottengo un infinite loop. ![]() Comunque ti allego il programma cosi' lo controlli meglio e mi dici cosa ne pensi. Ti ringrazio tanto
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: C++ e EOF in Windows
Forse la cosa migliore non e' controllare il carattere EOF ma lo stato del canale. Ad esempio
Codice:
cout << "Premi Enter per cominciare"; while ( cin.get( valore )) // equivalente a cin.get( valore ).good() { cout << "Inserire valore"; cin >> valore; cout << "Inserire valore2"; cin >> valore2; calcolo dei valori; } cout "Messaggio uscita"; |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
Ciao /\/\@®¢Ø e grazie della risposta!
L'idea sembra carina ma purtroppo non funziona! Infatti il compilatore mi dice che non e' stata trovata una funzione per la chiamata ![]() Ti ringrazio comunque della tua risposta!
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Si' scusa, ho fatto un po' di confusione io
![]() Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
E come potrei gestire la situazione? Se il compilatore incontra un EOF non dovrebbe mandare direttamente fuori dal ciclo while? Te lo chiedo perche' seguendo il modo che mi hai detto, quando inserisco EOF ho un infinite loop di nuovo.
Sinceramente non capisco ![]()
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
In teoria sarebbe buona cosa controllare dopo ogni lettura lo stato del canale, ovvero scrivere (ad esempio) un
Codice:
if ( cin >> valore ) Codice:
cin >> valore; In alternativa una soluzione piu' pulita e' quella di ricorrere alle eccezioni: Codice:
cin.exceptions( ios_base::eofbit ); try { while( true ) { cout << "Inserire valore"; cin >> valore; cout << "Inserire valore2"; cin >> valore2; /* calcolo dei valori; */ } } catch( ios_base::failure ) { /* fine */ } |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
/\/\@®¢Ø ti ringrazio delle tue risposte nonche' del tempo che hai perso per scrivere il codice. Molto gentile!
Ho capito come dovrei gestire in teoria il problema (anche se in c++ non ho ancora visto le exceptions). E dico in teoria perche' in pratica continua a non funzionare dandomi di nuovo infinte loop con EOF ![]() Il problema credo sia da attribuire al valore che viene dato alla variabile che gestisce l'EOF dopo che ho premuto Enter (tale valore e' 1 ). In ogni caso provero' altre soluzioni per vedere che ne esce fuori. Ringrazio di nuovo te, kk3z e Ziosilvio delle vostre risposte.
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
le due variabili sono degli interi giusto ? E tu non gli dai il carattere EOF, ma scrivi la stringa EOF al posto del numero. Se ho indovinato, ho capito dove e' il problema: quando cerchi di leggere una stringa alfanumerica in una variabile numerica, puo' capitare che la lettura vada in "loop". (Piu' correttamente, al primo colpo si blocca, ma poi passa alla lettura successiva dove entra in loop). Puoi risolvere in diversi modi... il piu' veloce che mi viene in mente (e il meno pulito ![]() Nel codice che ho scritto sopra invece di Codice:
cin.exceptions( ios_base::eofbit ); Codice:
cin.exceptions( ios_base::eofbit | ios_base::failbit | ios_base::badbit ); Fammi sapere se ti funziona. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non è che per EOF intende il CTRL + Z ? Che in Windows non c'è...
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Feb 2003
Città: Pisa - Thessaloniki
Messaggi: 2213
|
Quote:
Mi sa che adesso do un'occhiata alle exceptions ![]() Ancora una volta ti ringrazio per il tempo che hai sprecato per aiutarmi. Grazie davvero! Per cionci: Grazie anche a te cionci ma non intendevo il SIGSTOP di Linux. Era proprio quello che mi ha detto Marco. Grazie comunque ![]()
__________________
AMD Athlon 64 X2 5200+, 4GB DDR2, Asus M2N32-SLI Deluxe, GeForce 8800 GT, 2 Seagate SATA 80GB + 1 Maxtor 160 SATA, SB Live, Pioneer DVD106, Benq DW1640, Asus VH242H |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
per evitare il problema conviene usare questo codice
Codice:
std::string input; std::getline(std::cin, input); l'inconveniente è che bisogna dare un invio dopo la digitazione, ma ora non ho presente se lo si deve fare anche con il cin... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:57.