2011-10-06 7 views
9

Ho bisogno di leggere simbolo per simbolo. Ma non so come leggere fino alla fine dell'input. Come sistema di prova esemplificativo sarà cin >> somecharvariable volte m. Devo leggere simbolo per simbolo tutti i personaggi. Solo m volte. Come posso farlo?C++ cin char read symbol-by-symbol

+0

Prova a metterlo in una stringa. –

+0

Stai leggendo fino alla fine dell'input, * m * volte o stai leggendo * m * quantità di simboli? –

+0

o guarda in 'istream :: get (char * buffer, size_t len, char delimiter)' e 'istream :: read (char * buffer, size_t len)' se vuoi tutti i byte compresi spazi bianchi e newline –

risposta

5

Se si desidera ingresso formattato carattere per carattere, procedere come segue:

char c; 
while (infile >> c) 
{ 
    // process character c 
} 

Se volete leggere i byte prime, fare questo:

char b; 
while (infile.get(b)) 
// while(infile.read(&b, 1) // alternative, compare and profile 
{ 
    // process byte b 
} 

In entrambi i casi, infile dovrebbe essere di tipo std::istream & o simile, ad esempio un file o std::cin.

+0

Per la lettura di byte non elaborati (symbos), il metodo 'cin.read' è in genere più efficiente, come minimo utilizza chiamate con meno funzioni. –

+0

@ThomasMatthews: Grazie, ci ho pensato anch'io - ho aggiunto la versione alternativa. –

0

Prova questa:

#include <iostream> 
using std::cin; 
using std::cout; 

int main(int argc, char *argv[]) 
{ 
    char ch; 
    unsigned m = 10; 
    while (cin && m--) { 
     cin.read(&ch, sizeof(ch)); 
     cout << ch; 
    } 
    return 0; 
} 
+1

Perché il cast da un 'char *' per un 'char *'? –

+0

Questa soluzione non legge * m * quantità di simboli o non ripete la lettura fino a EOF, * m * volte. –

+0

@ThomasMatthews Risolto. – Sergey

3

Ci sono diversi modi per leggere un carattere alla volta fino a quando non li avete letto, e nessuno di loro è necessariamente la migliore.

Personalmente, mi piacerebbe andare con il seguente codice:

char c; 
while (cin.get(c)) { 
    // Process c here. 
} 

Se avete solo bisogno di leggere m caratteri, è consigliabile utilizzare un ciclo for:

char c; 
for (unsigned int i = 0; i < m && cin.get(c); ++i) { 
    // Process c here. 
} 

Questo viene eseguito il loop più a lungo poiché sono soddisfatte due condizioni: (1) sono stati letti meno di m caratteri e (2) ci sono ancora caratteri da leggere.

Tuttavia, entrambe le soluzioni presentano uno svantaggio: sono relativamente inefficienti. È più efficiente leggere i caratteri m in un colpo solo.

Quindi, prima allocare un buffer abbastanza grande per memorizzare m caratteri e quindi tentare di leggerli:

std::vector<char> buffer(m); 
cin.read(&m[0], m); 
unsigned total_read = cin.gcount(); 

Avviso l'ultima riga - questo vi dirà se m personaggi sono stati effettivamente letto.

+0

Questa soluzione non legge la m quantità di simboli o non ripete la lettura fino a EOF, m volte. –

+0

@Thomas Vedi aggiornamento. –

+0

+1 per l'aggiornamento, in particolare per quanto riguarda il caso EOF nel ciclo 'for'. –