Archivo con registros de longitud variable [C] [Resuelto]

Iniciado por milx86, 26 Septiembre 2014, 17:37 PM

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

milx86

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

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

#include <stdio.h>
#include <string.h>

FILE *fd;

void mostrarHotmails(void);

int main(int argc, char *argv[]){
   mostrarHotmails();
   return 0;
}

void mostrarHotmails(void){
   char c;

   if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
       printf("\nNo se pudo abrir el archivo.");
       exit(1);
   }

   else{
       char find[13] = "@hotmail.com"; // email que voy a buscar
       char email[13];                 // para almacenar el dominio de emails de los usuarios (para luego comparar con find)
       char contacto[30];              // para almacenar todo el registro del contacto
       int contC = 0;                  //este contador me indica si ya llegue al campo de email
       fseek(fd,0,0);

       while( !feof(fd) ){ // mientras no sea fin de archivo, leer un caracter.

           c = fgetc(fd);
           if( c == ';'){
               contC++;

               if(contC==2){   // Ya llegue al inicio del campo email.
                   c = fgetc(fd);
                   while(c!='^'){
                       int i=0; // indice para el arreglo contacto.
                       contacto[i++] = c;
                       if(c=='@'){
                           int ie = 0; // indice de email

                           while(c!='^'){
                               email[ie++] = c;
                               contacto[i++] = c;
                               c = fgetc(fd);
                           }

                           email[ie] = '\0';
                           contacto[i] = '\0';
                           if(strcmp(email,find)==0){
                               printf("%s\n",contacto);
                           }
                       }
                       c = fgetc(fd);
                   }
               }
           }
           if( c == '^'){ // Fin de registro, reinicio el contador de campos.
               contC = 0;
           }

       } // Fin de while
       fclose(fd);
   }
}


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
La abstracción es la clave para lidiar con la complejidad.

Drewermerc

#1
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:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
FILE *fd;

void mostrarHotmails(void);

int main(int argc, char *argv[]){
    mostrarHotmails();
    return 0;
}

void mostrarHotmails(void){
    char c;

    if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
        printf("\nNo se pudo abrir el archivo.");
        exit(1);
    }

    else{
        char find[13] = "@hotmail.com"; // email que voy a buscar
        char email[13];                 // para almacenar el dominio de emails de los usuarios (para luego comparar con find)
        char contacto[30];              // para almacenar todo el registro del contacto
int i=0, j = 0; // indice para el arreglo contacto.
char user[30] = {'\0'};
        int contC = 0;                 //este contador me indica si ya llegue al campo de email
int ie = 0;
        fseek(fd,0,0);

        while( (c = fgetc(fd)) != EOF ){ // mientras no sea fin de archivo, leer un caracter.

            if( (c == ';') && (c != EOF)){
                ++contC;

                if((contC==2) && (c != EOF)){   // Ya llegue al inicio del campo email.
                    c = fgetc(fd);
                    while((c!='^') && (c != EOF)){

if((c != '@') && (c != ';') && (c != EOF))
{
for( i =0; i<30 ; i++)
user[i] = '\0';
  i=0; j = 0;

while((c != '@') && (c != ';') && (c != EOF))
{
user[j++] = c;
c = fgetc(fd);
}
}
                        if((c=='@') && (c != EOF)){
i=0;
                            ie = 0; // indice de email

                            while((c!='^') && (c != EOF)){
                                email[ie++] = c;
                                contacto[i++] = c;
                                c = fgetc(fd);
                            }
    if( (c == '^') && (c != EOF))
contC = 0;

                            email[ie] = '\0';
                            contacto[i] = '\0';
                            if(strcmp(email,find)==0){
                                printf("%s%s\n",user,contacto);
                            }
                        }
                        c = fgetc(fd);

                    }


                }
            }


        } // Fin de while
        fclose(fd);
    }
}


Espero te sirva.
Saludos.
Drewermerc.

milx86

#2
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.

#include <stdio.h>
#include <string.h>

FILE *fd;

void mostrarHotmails(void);

int main(int argc, char *argv[]){
   mostrarHotmails();
   return 0;
}


void mostrarHotmails(void){

   if( (fd=fopen("data_Prog_01.txt","rt")) == NULL ){
       printf("\nNo se pudo abrir el archivo.");
       exit(-1);
   }

   else{
       char find[13];      // email que voy a buscar
       char email[15];     // para almacenar dominio del usuario (luego comparo con find)
       char contacto[30];  // para almacenar todo el correo del contacto
       int contC = 0;      //este contador me indica si ya llegue al campo de email
       int i=0;
       int ie=0;
       char c;
       fseek(fd,0,0);
       printf("ingrese dominio: ");
       gets(find);

       while( !feof(fd)){  // Para recorrer todo el archivo

           //mover el puntero/cursor hasta el campo de email.
           while(contC<2 && (c != EOF)){
               c = fgetc(fd);
               if( c == ';'){
                   contC++;
               }
           }

           // para capturar parcialmente el correo (userX@)
           while(c!='@' && (c != EOF)){
               c = fgetc(fd);
               contacto[i++] = c;
           }

           contacto[i++] = '\0';

           if(c=='@' && (c != EOF)){//comienzo a capturar el dominio
               ie=0;
               c = fgetc(fd);
               while(c!='^' && (c != EOF)){
                   email[ie++] = c;
                   c = fgetc(fd);
               }
               email[ie] = '\0';
           }
           // reinicio mi indice y contC para usar los arreglos
           // para el siguiente registro.
           i=0;
           contC = 0;
           //Comparo e imprimo
           if(strcmp(email,find)==0){
               printf("%s%s\n",contacto,email);
           }
       }// Fin while
       fclose(fd);
   }
}


Nuevamente gracías, ya nos leeremos en otra oportunidad.
Saludos  :D
La abstracción es la clave para lidiar con la complejidad.