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
risposta
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
.
Per la lettura di byte non elaborati (symbos), il metodo 'cin.read' è in genere più efficiente, come minimo utilizza chiamate con meno funzioni. –
@ThomasMatthews: Grazie, ci ho pensato anch'io - ho aggiunto la versione alternativa. –
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;
}
Perché il cast da un 'char *' per un 'char *'? –
Questa soluzione non legge * m * quantità di simboli o non ripete la lettura fino a EOF, * m * volte. –
@ThomasMatthews Risolto. – Sergey
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.
Questa soluzione non legge la m quantità di simboli o non ripete la lettura fino a EOF, m volte. –
@Thomas Vedi aggiornamento. –
+1 per l'aggiornamento, in particolare per quanto riguarda il caso EOF nel ciclo 'for'. –
Prova a metterlo in una stringa. –
Stai leggendo fino alla fine dell'input, * m * volte o stai leggendo * m * quantità di simboli? –
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 –