Autor
|
Tema: Estructura y archivos en c++ (Leído 3,928 veces)
|
Luifs
Desconectado
Mensajes: 8
|
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
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
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 
|
|
|
En línea
|
|
|
|
Luifs
Desconectado
Mensajes: 8
|
Muchas gracias.. pero sera lo mismo a la hora de jalar la cadena de texto desde un archivo.txt?
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
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  Saludos!!
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
if(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";
|
|
|
En línea
|
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
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.  Saludos!!
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
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.
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
Puntoinfinito
Desconectado
Mensajes: 919
#! /win/archlinux
|
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
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
|
|