Buenas tardes disculpen tengo una duda.. necesito saber como hacer para que yo pueda extraer una cadena de texto y designarla a varias variables de una estructura en c++ ejemplo:
Nombres10402515
en la cual pudiera sacar las 3 variables un char y dos int.
Nombre 1040 2515
Bueno pues facil, miras y analizas cadena de texto y seguidamente haces la conversión si hace falta, para luego guardarlo en una variable. Por ejemplo:
#include <iostream>
int integer1, integer2; // Creas variables
char caracter1[128];
int main() {
string msg = "Nombres10402515"; // Pones la cadena a analizar
int size = msg.size(); // Miras el total de caracteres de msg
for (int i = 0; i < size; i++) /* Entramos en bucle para analizar letra por letra */ {
if (msg[i] == "0-9") { integer1 = atoi(msg[i]); }
} else if (msg[i] == "A-Z") { /* Lo mismo pero pasarlo a char */ }
// ETC...
}
}
Esto es un ejemplo sin acabar, solo para que te ayude a pensar, lo que queda es hacer que cada vez que se añada un valor a una variable, se añada al final su contenido y que no se le sobrescriba. Y luego, si quieres que se dividan los integers en 2 variables, haz otra comparación para ver si esta llena y así entonces rellenar la siguiente. (Con size sería fácil). Saludos :D
Muchas gracias.. pero sera lo mismo a la hora de jalar la cadena de texto desde un archivo.txt?
Claro, pero debes primero cojerla xD Con fstream puedes.
Esta sería una opción, no muy utilizada pero esta más o menos así en el ejemplo de ifstream en la página oficial de C++.
ifstream archivo_texto;
archivo_texto.open("/directorio/archivo.txt",std::ifstream::in);
char c = ifs.get();
while (ifs.good()) {
cout << c; /* Con esto vas imprimiendo el contenido del texto, puedes hacer que se vaya almacenando y así hará lo que quieres */
c = ifs.get();
}
otra opción mejor:
#include <fstream.h>
int main()
{
ifstream archivo("Pruebas.txt", ios::noreplace);
char linea[128];
if(archivo.fail())
cerr << "Error al abrir el archivo Pruebas.txt" << endl;
else
while(!archivo.eof())
{
archivo.getline(linea, sizeof(linea));
cout << linea << endl;
}
archivo.close();
return 0;
}
Si no entiendes algo, here I am :D Saludos!!
Cuando se procesa el contenido de un archivo no se recomienda el uso de las funciones feof (en el caso de C) y eof (C++) ya que estas retornan verdadero solo después del fallo en una operación de lectura.
En su lugar lo usual es utilizar el valor de retorno de la función, por ejemplo el bucle en el programa de Puntoinfinito se puede reducir a:
while (archivo.getline(linea, sizeof(linea)))
cout << linea << endl;
Un saludo
Cita de: Puntoinfinito en 7 Junio 2013, 17:59 PMif(archivo.fail())
cerr << "Error al abrir el archivo Pruebas.txt" << endl;
fail() indica errores en la operación de lectura, no te sirve para comprobar aperturas.
Yo uso:
if (!archivo.is_open
())
cerr<<"no se encontro el archivo";
O bien:
if (!archivo)
cerr<<"No se encontro el archivo";
Cierto, gracias, junto a lo que dijeron los dos compañeros quedaría así:
if(archivo.is_open())
cerr << "Error al abrir el archivo Pruebas.txt" << endl;
else
while(archivo.getline(linea, sizeof(linea)))
{
cout << linea << endl;
// Aqui puede poner que la variable linea se añada a alguna char
}
archivo.close();
Lo del fail() fue un error mío de no fijarme en el código, perdón jajaja. Luifs, ahora si añades eso y a la vez que vayas mirando la variable linea que has extraído ya lo tienes. :D Saludos!!
if (msg[i] == "0-9") { integer1 = atoi(msg[i]); }
Fíjate en esa comparación, estás comparando un caracter con una cadena, eso no debería compilar, ni determinar si el carácter representa un número.
Por otra parte el hecho de que @rir3760 no lo haya indicado me hace dudar... xD
Saludos.
A lo que me refiero con "0-9", es que debe mirar si el carácter coincide con algún número del 0 al 9. No se si con números lo de hacer "0-9" funciona, pero en todo caso puede poner un if ( .. || ...) y sloved
Cita de: Puntoinfinito en 7 Junio 2013, 22:43 PM
A lo que me refiero con "0-9", es que debe mirar si el carácter coincide con algún número del 0 al 9. No se si con números lo de hacer "0-9" funciona
No, no funciona.
Si la idea es verificar si un carácter es un dígito se puede utilizar un operador lógico, por ejemplo:
if (msg[i] >= '0' && msg[i] <= '9'){
// Es un digito
}
O bien la función (usualmente implementada como macro) isdigit (prototipo en <ctype.h> en C y <cctype> en C++):
if (isdigit(msg[i])){
// Es un digito
}
Un saludo