n° 154
Settembre 2010
Settembre 03, 2010, 04:22:34 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: Usi il PC già da qualche anno? partecipa alla discussione nell'area Retrocomputing
 
   Indice   Linux Windows Internet videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


 SONDAGGIO
Saresti interessato a seguire online dei videocorsi?
Sì | No
Se sì, quali di questi argomenti sarebbero di tuo gradimento?

.NET Framework   PHP
ASP.NET Python
Attività SEO Ruby
C# Silverlight
C/C++ Visual Basic .NET
Java Windows Azure
Java per Android Windows Phone 7
Objective-C (iPhone / iPad) Altri

Attenzione! Per partecipare al sondaggio bisogna essere registrati al forum




* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [C] stdin, stdin...oh caro stream di input, come ti pulisco io ?  (Letto 2034 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
ienabellamy
Newbie
*

Karma: +2/-3
Scollegato Scollegato

Messaggi: 11


Mostra profilo
« inserita:: Gennaio 24, 2008, 10:25:53 pm »

Ogni volta che uso scanf e' un dramma.

fflush(stdin) non funziona sulla mia Debian.

La mia vita e' un:

Codice:
while(getc(stdin) != '\n');

o dei vari:
getchar();

per pulire l'stdin.

io cerco proprio una funzione che mi pulisca lo stream di input. Non c'e' un'alternativa a fflush , che proprio non funziona  ?
(escludete fgets/gets, io voglio usare scanf per certe cose. e anche cose come scanf[^/n], perche non funzionano. )
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #1 inserita:: Gennaio 24, 2008, 10:58:12 pm »

Alas, scanf() e fscanf() sono funzioni deprecate per numerosi motivi, dalle performance alla sicurezza. Si deve invece utilizzare sscanf() su un buffer, il che implica l'uso di fgets() o read().

Se fflush(stdin) non funziona sul tuo compilatore preferito, è il momento di cambiare abitudini || compilatore || SO: oppure di utilizzare una standard library all'altezza della situazione.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
ienabellamy
Newbie
*

Karma: +2/-3
Scollegato Scollegato

Messaggi: 11


Mostra profilo
« Risposta #2 inserita:: Gennaio 25, 2008, 06:48:42 pm »

mmm ma leggendo la doc di fflush, da quanto ho capito non si usa sul buffer di input... cioe' da' risultati imprevedibili... il problema maw e' che avendo un professore pignolo, dobbiamo usare certe funzioni e solo quelle per certi lavori.

Ecco perche chiedevo una funzione che pulisse proprio l'stdin.

Anyway, thanks Sorriso
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +126/-3
Scollegato Scollegato

Messaggi: 2115


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #3 inserita:: Gennaio 26, 2008, 01:18:55 am »

La fflush() sullo stdin è uno di quei problemi che i vari standard hanno continuato a rimpallarsi fin dai tempi in cui lo stdin stesso proveniva da un lettore di schede perforate, ed era di gran lunga più facile trovare un mainfraime che un PC.

Lo standard, fin dal C'89, è estremamente chiaro: si tratta di una operazione opzionale. I compilatori non hanno l'obbligo di implementare la fflush() sugli stream di input.
Alcuni compilatori (tipicamente quelli nati in area PC DOS) ne forniscono una implementazione, altri preferiscono ignorare del tutto tale opzione.

In realtà, azzerare la coda circolare di tastiera gestita dal BIOS su qualsiasi PC IBM compatibile è un'operazione di una semplicità imbarazzante a basso livello: concettualmente si tratta di rendere uguali i contenuti dei due puntatori first/last char nella BIOS data area, tipicamente copiando arbitrariamente nell'uno il contenuto dell'altro. Tali puntatori al buffer di tastiera sono reperibili all'indirizzo segmentato 0000:041Ah e 0000:041Ch rispettivamente.
Tenendo conto di tutte le possibilità, occorrono nel peggiore dei casi otto o dieci linee di Assembly. Ghigno

La questione è però molto semplice, anche se sgradevole nella sua brutalità. Dal momento che sia DOS che i brand Unix hanno sempre avuto librerie "non standard" ma standard de facto per la gestione della consolle (vedasi il benemerito conio.h di Borland, copiato a destra ed a manca), a nessuno giustamente fregava e frega alcunché di sistemare la questione modificando in tale senso un qualsiasi standard.

D'altro canto, nel terzo millennio e con l'attuale desolantissimo panorama di omologazione ed appiattimento non si può scrivere uno standard continuando a far finta di non sapere cos'è e com'è fatta una tastiera, assumendo che vi siano ancora due o tre dozzine di architetture diverse e tra loro incompatibili come negli anni '80: oggi la scelta è libera tra wintel, wintel, wintel, wintel, wintel e x86 su MAC.
Quei quattro fregnoni che usano Alpha, PPC e MIPS, incluso il sottoscritto, sono comunque abituati ad arrangiarsi, facendo di necessità virtù. E i clienti AS/400 dell'IBM hanno ben altro a cui pensare.

Ne consegue in sintesi che i vessilliferi free/opensource col vizio congenito di appellarsi sempre ai salvifici standard invece di usare - quando occorre - il cervello{*} finiscono per produrre implementazioni della consolle fallate e incomplete, con tutto quel che ne consegue a livello di fflush() sugli stream di input.


Bottom line: al giorno d'oggi è meglio non usare questa feature se non si hanno granitiche certezze in merito a piattaforma e compilatore: anche se sarebbe necessario averla (e molto banale standardizzarla).


{*} Ciò è doppiamente balordo poiché avviene solo quando fa politicamente comodo: egcs e gcc hanno anche loro delle belle liste di comportamenti apertamente contrari agli standard; eppure - come ho già accennato in passato - alcuni estensori del C'99 erano/sono anche sviluppatori di gcc...
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
ienabellamy
Newbie
*

Karma: +2/-3
Scollegato Scollegato

Messaggi: 11


Mostra profilo
« Risposta #4 inserita:: Gennaio 27, 2008, 02:43:22 am »

Concordo su tutto !

 Occhiolino
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2009 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page