Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Luifs en 7 Junio 2013, 17:03 pm



Título: Estructura y archivos en c++
Publicado por: Luifs en 7 Junio 2013, 17:03 pm
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



Título: Re: Estructura y archivos en c++
Publicado por: Puntoinfinito en 7 Junio 2013, 17:21 pm
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:

Código
  1. #include <iostream>
  2.  
  3. int integer1, integer2; // Creas variables
  4. char caracter1[128];
  5.  
  6. int main() {
  7.    string msg = "Nombres10402515"; // Pones la cadena a analizar
  8.    int size = msg.size(); // Miras el total de caracteres de msg
  9.    for (int i = 0; i < size; i++) /* Entramos en bucle para analizar letra por letra */ {
  10.        if (msg[i] == "0-9") { integer1 = atoi(msg[i]); }
  11.        } else if (msg[i] == "A-Z") { /* Lo mismo pero pasarlo a char */ }
  12.    // ETC...
  13.    }
  14. }

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


Título: Re: Estructura y archivos en c++
Publicado por: Luifs en 7 Junio 2013, 17:37 pm
Muchas gracias.. pero sera lo mismo a la hora de jalar la cadena de texto desde un archivo.txt?


Título: Re: Estructura y archivos en c++
Publicado por: Puntoinfinito en 7 Junio 2013, 17:59 pm
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++.
Código
  1. ifstream archivo_texto;
  2. archivo_texto.open("/directorio/archivo.txt",std::ifstream::in);
  3. char c = ifs.get();
  4. while (ifs.good()) {
  5.    cout << c; /* Con esto vas imprimiendo el contenido del texto, puedes hacer que se vaya almacenando y así hará lo que quieres */
  6.    c = ifs.get();
  7. }

otra opción mejor:

Código
  1. #include <fstream.h>
  2.  
  3. int main()
  4. {
  5.    ifstream archivo("Pruebas.txt", ios::noreplace);
  6.    char linea[128];
  7.  
  8.    if(archivo.fail())
  9.    cerr << "Error al abrir el archivo Pruebas.txt" << endl;
  10.    else
  11.    while(!archivo.eof())
  12.    {
  13.        archivo.getline(linea, sizeof(linea));
  14.        cout << linea << endl;
  15.    }
  16.    archivo.close();
  17.    return 0;
  18. }

Si no entiendes algo, here I am  :D Saludos!!


Título: Re: Estructura y archivos en c++
Publicado por: rir3760 en 7 Junio 2013, 18:37 pm
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:
Código
  1. while (archivo.getline(linea, sizeof(linea)))
  2.   cout << linea << endl;

Un saludo


Título: Re: Estructura y archivos en c++
Publicado por: amchacon en 7 Junio 2013, 18:51 pm
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:

Código
  1. if (!archivo.is_open
  2. ())
  3.  
  4. cerr<<"no se encontro el archivo";

O bien:

Código
  1. if (!archivo)
  2. cerr<<"No se encontro el archivo";


Título: Re: Estructura y archivos en c++
Publicado por: Puntoinfinito en 7 Junio 2013, 21:45 pm
Cierto, gracias, junto a lo que dijeron los dos compañeros quedaría así:

Código
  1. if(archivo.is_open())
  2.   cerr << "Error al abrir el archivo Pruebas.txt" << endl;
  3.   else
  4.   while(archivo.getline(linea, sizeof(linea)))
  5.   {
  6.       cout << linea << endl;
  7.       // Aqui puede poner que la variable linea se añada a alguna char
  8.   }
  9.   archivo.close();
  10.  

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!!


Título: Re: Estructura y archivos en c++
Publicado por: 0xDani en 7 Junio 2013, 22:20 pm
Código
  1. 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.


Título: Re: Estructura y archivos en c++
Publicado por: 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, pero en todo caso puede poner un if ( .. || ...) y sloved


Título: Re: Estructura y archivos en c++
Publicado por: rir3760 en 8 Junio 2013, 02:45 am
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:
Código
  1. if (msg[i] >= '0' && msg[i] <= '9'){
  2.   // Es un digito
  3. }

O bien la función (usualmente implementada como macro) isdigit (prototipo en <ctype.h> en C y <cctype> en C++):
Código
  1. if (isdigit(msg[i])){
  2.   // Es un digito
  3. }

Un saludo