Estructura y archivos en c++

Iniciado por Luifs, 7 Junio 2013, 17:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Luifs

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


Puntoinfinito

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 (cpp) [Seleccionar]
#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
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

Luifs

Muchas gracias.. pero sera lo mismo a la hora de jalar la cadena de texto desde un archivo.txt?

Puntoinfinito

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 (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
#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!!
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

rir3760

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 (cpp) [Seleccionar]
while (archivo.getline(linea, sizeof(linea)))
   cout << linea << endl;


Un saludo
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

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:

Código (cpp) [Seleccionar]
if (!archivo.is_open
())

cerr<<"no se encontro el archivo";


O bien:

Código (cpp) [Seleccionar]
if (!archivo)
cerr<<"No se encontro el archivo";
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Puntoinfinito

Cierto, gracias, junto a lo que dijeron los dos compañeros quedaría así:

Código (cpp) [Seleccionar]
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!!
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

0xDani

Código (cpp) [Seleccionar]
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.
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

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
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

rir3760

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:
Código (cpp) [Seleccionar]
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++):
Código (cpp) [Seleccionar]
if (isdigit(msg[i])){
   // Es un digito
}


Un saludo
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