Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: milx86 en 26 Septiembre 2014, 17:37 pm



Título: Archivo con registros de longitud variable [C] [Resuelto]
Publicado por: milx86 en 26 Septiembre 2014, 17:37 pm
Buenas a todos, espero que esten bien.
Tengo el siguiente problema, agradecería que le den una ojeada y me den algun consejo.

Tengo un archivo .txt con algunos registros con delimitadores
La estructura de mi archivo seria algo asi...
Código:
01;user01;user01@hotmail.com^02;user02;user02@gmail.com^03;user03;user03@yahoo.com^04;user04;user04@hotmail.com^05;user05;user05@facebook.com^
Donde:
Citar
';' delimitador de campo
'^' delimitador de registro
Lo que tengo que hacer por ahora es mostrar todo el registro de aquellos que tengan cuentas de hotmail

Lo que e hecho hasta ahora es
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. FILE *fd;
  5.  
  6. void mostrarHotmails(void);
  7.  
  8. int main(int argc, char *argv[]){
  9.    mostrarHotmails();
  10.    return 0;
  11. }
  12.  
  13. void mostrarHotmails(void){
  14.    char c;
  15.  
  16.    if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
  17.        printf("\nNo se pudo abrir el archivo.");
  18.        exit(1);
  19.    }
  20.  
  21.    else{
  22.        char find[13] = "@hotmail.com"; // email que voy a buscar
  23.        char email[13];                 // para almacenar el dominio de emails de los usuarios (para luego comparar con find)
  24.        char contacto[30];              // para almacenar todo el registro del contacto
  25.        int contC = 0;                  //este contador me indica si ya llegue al campo de email
  26.        fseek(fd,0,0);
  27.  
  28.        while( !feof(fd) ){ // mientras no sea fin de archivo, leer un caracter.
  29.  
  30.            c = fgetc(fd);
  31.            if( c == ';'){
  32.                contC++;
  33.  
  34.                if(contC==2){   // Ya llegue al inicio del campo email.
  35.                    c = fgetc(fd);
  36.                    while(c!='^'){
  37.                        int i=0; // indice para el arreglo contacto.
  38.                        contacto[i++] = c;
  39.                        if(c=='@'){
  40.                            int ie = 0; // indice de email
  41.  
  42.                            while(c!='^'){
  43.                                email[ie++] = c;
  44.                                contacto[i++] = c;
  45.                                c = fgetc(fd);
  46.                            }
  47.  
  48.                            email[ie] = '\0';
  49.                            contacto[i] = '\0';
  50.                            if(strcmp(email,find)==0){
  51.                                printf("%s\n",contacto);
  52.                            }
  53.                        }
  54.                        c = fgetc(fd);
  55.                    }
  56.                }
  57.            }
  58.            if( c == '^'){ // Fin de registro, reinicio el contador de campos.
  59.                contC = 0;
  60.            }
  61.  
  62.        } // Fin de while
  63.        fclose(fd);
  64.    }
  65. }
  66.  

El resultado al ejecutar el programa es este...
Citar
@@hotmail.com
@@hotmail.com

Como veran, me muestra dos veces el '@' y creo que es debido a que despues de guardar el caracter leido(linea 38) en la linea 44 lo vuelve a guardar.
Aun asi no entiendo porque solo me muestra los dominios y no toda la dirección de correo.

Me parece haber leido algo como "strcmp solo compara cadenas (no arrays de cadenas)", no se si por eso no me funcione el programa.

Gracias por su tiempo chicos  :D


Título: Re: Archivo con registros de longitud variable [C]
Publicado por: Drewermerc en 26 Septiembre 2014, 23:16 pm
Hola free_c0de.

Solo basta con quitar contacto[i++] = c; de la linea 39 ya que desde hay ya almacenaste el @ y cuando mas abajo haces la otra comparación la vuelve almacenar.
Edito:
bueno no había leído lo ultimo de tu mensaje bueno si quieres que se muestre todo el e-mail completo sin hacerle mucha modificación a tu código:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. FILE *fd;
  5.  
  6. void mostrarHotmails(void);
  7.  
  8. int main(int argc, char *argv[]){
  9.    mostrarHotmails();
  10.    return 0;
  11. }
  12.  
  13. void mostrarHotmails(void){
  14.    char c;
  15.  
  16.    if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
  17.        printf("\nNo se pudo abrir el archivo.");
  18.        exit(1);
  19.    }
  20.  
  21.    else{
  22.        char find[13] = "@hotmail.com"; // email que voy a buscar
  23.        char email[13];                 // para almacenar el dominio de emails de los usuarios (para luego comparar con find)
  24.        char contacto[30];              // para almacenar todo el registro del contacto
  25. int i=0, j = 0; // indice para el arreglo contacto.
  26. char user[30] = {'\0'};
  27.        int contC = 0;                 //este contador me indica si ya llegue al campo de email
  28. int ie = 0;
  29.        fseek(fd,0,0);
  30.  
  31.        while( (c = fgetc(fd)) != EOF ){ // mientras no sea fin de archivo, leer un caracter.
  32.  
  33.            if( (c == ';') && (c != EOF)){
  34.                ++contC;
  35.  
  36.                if((contC==2) && (c != EOF)){   // Ya llegue al inicio del campo email.
  37.                    c = fgetc(fd);
  38.                    while((c!='^') && (c != EOF)){
  39.  
  40. if((c != '@') && (c != ';') && (c != EOF))
  41. {
  42. for( i =0; i<30 ; i++)
  43. user[i] = '\0';
  44.   i=0; j = 0;
  45.  
  46. while((c != '@') && (c != ';') && (c != EOF))
  47. {
  48. user[j++] = c;
  49. c = fgetc(fd);
  50. }
  51. }
  52.                         if((c=='@') && (c != EOF)){
  53. i=0;
  54.                            ie = 0; // indice de email
  55.  
  56.                            while((c!='^') && (c != EOF)){
  57.                                email[ie++] = c;
  58.                                contacto[i++] = c;
  59.                                c = fgetc(fd);
  60.                            }
  61.    if( (c == '^') && (c != EOF))
  62. contC = 0;
  63.  
  64.                            email[ie] = '\0';
  65.                            contacto[i] = '\0';
  66.                            if(strcmp(email,find)==0){
  67.                                printf("%s%s\n",user,contacto);
  68.                            }
  69.                        }
  70.                        c = fgetc(fd);
  71.  
  72.                    }
  73.  
  74.  
  75.                }
  76.            }
  77.  
  78.  
  79.        } // Fin de while
  80.        fclose(fd);
  81.    }
  82. }
  83.  

Espero te sirva.
Saludos.
Drewermerc.


Título: Re: Archivo con registros de longitud variable [C]
Publicado por: milx86 en 27 Septiembre 2014, 03:46 am
Hola Drewermerc, gracias por responderme.
Vaya que me hizo sufrir este problema  ;-)

Pero bueno, en lugar de ir directo al codigo, fuí a mi cama a pensarlo.
Y termine haciendolo asi.
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. FILE *fd;
  5.  
  6. void mostrarHotmails(void);
  7.  
  8. int main(int argc, char *argv[]){
  9.    mostrarHotmails();
  10.    return 0;
  11. }
  12.  
  13.  
  14. void mostrarHotmails(void){
  15.  
  16.    if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
  17.        printf("\nNo se pudo abrir el archivo.");
  18.        exit(-1);
  19.    }
  20.  
  21.    else{
  22.        char find[13];      // email que voy a buscar
  23.        char email[15];     // para almacenar dominio del usuario (luego comparo con find)
  24.        char contacto[30];  // para almacenar todo el correo del contacto
  25.        int contC = 0;      //este contador me indica si ya llegue al campo de email
  26.        int i=0;
  27.        int ie=0;
  28.        char c;
  29.        fseek(fd,0,0);
  30.        printf("ingrese dominio: ");
  31.        gets(find);
  32.  
  33.        while( !feof(fd)){  // Para recorrer todo el archivo
  34.  
  35.            //mover el puntero/cursor hasta el campo de email.
  36.            while(contC<2 && (c != EOF)){
  37.                c = fgetc(fd);
  38.                if( c == ';'){
  39.                    contC++;
  40.                }
  41.            }
  42.  
  43.            // para capturar parcialmente el correo (userX@)
  44.            while(c!='@' && (c != EOF)){
  45.                c = fgetc(fd);
  46.                contacto[i++] = c;
  47.            }
  48.  
  49.            contacto[i++] = '\0';
  50.  
  51.            if(c=='@' && (c != EOF)){//comienzo a capturar el dominio
  52.                ie=0;
  53.                c = fgetc(fd);
  54.                while(c!='^' && (c != EOF)){
  55.                    email[ie++] = c;
  56.                    c = fgetc(fd);
  57.                }
  58.                email[ie] = '\0';
  59.            }
  60.            // reinicio mi indice y contC para usar los arreglos
  61.            // para el siguiente registro.
  62.            i=0;
  63.            contC = 0;
  64.            //Comparo e imprimo
  65.            if(strcmp(email,find)==0){
  66.                printf("%s%s\n",contacto,email);
  67.            }
  68.        }// Fin while
  69.        fclose(fd);
  70.    }
  71. }
  72.  

Nuevamente gracías, ya nos leeremos en otra oportunidad.
Saludos  :D