2011-10-06 16 views
9

Necesito leer símbolo por símbolo. Pero no sé leer hasta el final de la entrada. Como ejemplo, el sistema de prueba calculará algunas variablesm veces. Tengo que leer símbolos por símbolos todos los caracteres. Solo m veces. ¿Cómo puedo hacerlo?C++ cin char leer símbolo por símbolo

+0

Intenta ponerlo en una cuerda. –

+0

¿Está leyendo hasta el final de la entrada, * m * veces, o está leyendo * m * cantidad de símbolos? –

+0

o busque 'istream :: get (char * buffer, size_t len, char delimitador)' y 'istream :: read (char * buffer, size_t len)' si quiere todos los bytes incluyendo espacios en blanco y nuevas líneas –

Respuesta

5

Si quieren de entrada con formato de carácter por carácter, haga lo siguiente:

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

Si desea leer bytes sin formato, hacer esto:

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

En cualquiera de los casos, infile debería haber del tipo std::istream & o similar, como un archivo o std::cin.

+0

Para leer bytes brutos (symbos), el método 'cin.read' suele ser más eficiente, como mínimo utiliza menos llamadas de función. –

+0

@ThomasMatthews: Gracias, pensé en eso también, agregué la versión alternativa. –

0

Prueba esto:

#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

¿Por qué el elenco de un 'char *' a un 'char *' –

+0

Esta solución no lee * m * cantidad de símbolos o no repite la lectura hasta EOF, * m * veces. –

+0

@ThomasMatthews Reparado. – Sergey

3

Hay varias maneras de leer un carácter a la vez hasta que las haya leído, y ninguno de ellos es necesariamente la mejor.

En lo personal, me gustaría ir con el siguiente código:

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

Si sólo necesita leer m caracteres, considerar el uso de un bucle for:

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

Esto ejecuta el bucle en tanto ya que se cumplen dos condiciones: (1) se han leído menos de m caracteres, y (2) todavía hay caracteres para leer.

Sin embargo, ambas soluciones tienen un inconveniente: son relativamente ineficientes. Es más eficiente leer los caracteres m de una vez.

Así que primero asignar un búfer suficientemente grande para almacenar m caracteres y luego tratar de leerlos:

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

Aviso de la última línea - esto le dirá si m personajes han leído realmente.

+0

Esta solución no lee m cantidad de símbolos o no repite la lectura hasta EOF, m veces. –

+0

@Thomas Ver actualización. –

+0

+1 para la actualización, especialmente cubriendo el caso EOF en el bucle 'for'. –