2013-07-04 8 views
8
#include <iostream> 
int main() 
{ 
    using namespace std; 
    cout << cin.rdbuf()->in_avail() << endl; 
    cin.putback(1); 
    cin.putback(1); 
    cout << cin.rdbuf()->in_avail() << endl; 
    return 0; 
} //compile by g++-4.8.1 

penso che questa uscita volontà 0 e 2Perché in_avail() produce zero anche se lo stream ha un carattere?

ma quando faccio funzionare il codice, uscita 0 e 0, perché?

o se cambio cin.putback (1); a int a; cin >> a; con input 12 12;

emette ancora 0 e 0

+0

La mia ipotesi è che sia perché non c'era nulla nello stream, quindi non è possibile "riproporre" nulla. Inoltre, potresti voler controllare il valore di ritorno di putback() per vedere se ha avuto successo. – PeterK

+0

@PeterK ma se lo faccio -> int a; cin >> a; con input: 12 1222; Ottengo ancora l'output 0 e 0 – miskcoo

+0

Esempio che mostra che succede anche se 'riposta' è riuscita: http://ideone.com/dUq3RF – interjay

risposta

2

cosa deve essere accaduto è che il vostro putback non ha trovato alcuna stanza nella zona streambuf ottenere associati con std::cin (altrimenti una posizione di lettura sarebbe stato disponibile e egptr() - gptr() sarebbe stato non zero) e deve essere passato a un livello sottostante grazie a pbackfail.

in_avail() chiamerà showmanyc() e zero (che è l'implementazione predefinita di questa funzione virtuale) è una cosa sicura da restituire in quanto significa che una lettura potrebbe bloccare e potrebbe non riuscire ma non è nemmeno garantito. Ovviamente è possibile che un'implementazione fornisca un'implementazione più utile per showmanyc() in questo caso, ma la semplice implementazione è economica e conforme.

1

A quanto pare si tratta di un bug/caratteristica di alcune implementazioni compilatore Inserire la linea di

cin.sync_with_stdio(false); 

da qualche parte vicino all'inizio del codice, e che dovrebbe risolvere il problema

EDIT: ricordare inoltre che in_avail tornerà sempre 1 più del numero di caratteri nell'input perché conta la fine del carattere di input.

EDIT2: Anche come ho appena controllato, il rimbalzo non funziona a meno che non si sia tentato di leggere prima qualcosa dallo stream, da qui il "ritorno" in "ripiego". Se vuoi inserire caratteri nel cin, questa discussione fornirà la risposta: Injecting string to 'cin'

Problemi correlati