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
Respuesta
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
.
Para leer bytes brutos (symbos), el método 'cin.read' suele ser más eficiente, como mínimo utiliza menos llamadas de función. –
@ThomasMatthews: Gracias, pensé en eso también, agregué la versión alternativa. –
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;
}
¿Por qué el elenco de un 'char *' a un 'char *' –
Esta solución no lee * m * cantidad de símbolos o no repite la lectura hasta EOF, * m * veces. –
@ThomasMatthews Reparado. – Sergey
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.
Esta solución no lee m cantidad de símbolos o no repite la lectura hasta EOF, m veces. –
@Thomas Ver actualización. –
+1 para la actualización, especialmente cubriendo el caso EOF en el bucle 'for'. –
- 1. error de símbolo duplicado C++
- 2. error de símbolo duplicado asociado con const char * [] declaración
- 3. C# equivalente al símbolo Ruby
- 4. C++ símbolo externo no resuelto
- 5. Objective-C++ símbolo no encontrado extrañeza
- 6. Cómo usar Cin Space en C++?
- 7. Egit "*" símbolo?
- 8. Símbolo Celsius en RichTextBox
- 9. ¿Qué representa el símbolo @ en objetivo-c?
- 10. símbolo '%' no estaba imprimiendo en Objective-C
- 11. ld: símbolo duplicado - causado por const
- 12. Significado del símbolo "~" (tilde) en C++?
- 13. ¿Qué es el símbolo "^" en C++?
- 14. C# String.Replace no encontrar/reemplazar Símbolo (™, ®)
- 15. ¿Qué significa el símbolo @ para Objective-C?
- 16. getActivity() no puede encontrar el símbolo símbolo: método getActivity()
- 17. Redefinición de un tipo diferente de símbolo
- 18. Eval() = símbolo inesperado: Error
- 19. Xcode, símbolo duplicado _principal
- 20. MySQL Workbench símbolo referencia
- 21. Desplazamiento en el valor del símbolo nm?
- 22. ¿Qué significa exportar un símbolo?
- 23. Android XML escape "@" Símbolo
- 24. Accesibilidad símbolo duplicado
- 25. ld: símbolo duplicado
- 26. Símbolo no encontrado: kUTTypeImage
- 27. símbolo cur curl no encontrado
- 28. Hibernate: org.hibernate.hql.ast.QuerySyntaxException: símbolo inesperado
- 29. NSNumberFormatter ¿Moneda sin símbolo?
- 30. Símbolo QED en latex
Intenta ponerlo en una cuerda. –
¿Está leyendo hasta el final de la entrada, * m * veces, o está leyendo * m * cantidad de símbolos? –
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 –