elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Archivo con registros de longitud variable [C] [Resuelto]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Archivo con registros de longitud variable [C] [Resuelto]  (Leído 6,146 veces)
milx86

Desconectado Desconectado

Mensajes: 42


Ver Perfil
Archivo con registros de longitud variable [C] [Resuelto]
« 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


« Última modificación: 28 Septiembre 2014, 01:23 am por free_c0de » En línea

La abstracción es la clave para lidiar con la complejidad.
Drewermerc

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Archivo con registros de longitud variable [C]
« Respuesta #1 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.


« Última modificación: 27 Septiembre 2014, 01:32 am por Drewermerc » En línea

milx86

Desconectado Desconectado

Mensajes: 42


Ver Perfil
Re: Archivo con registros de longitud variable [C]
« Respuesta #2 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
« Última modificación: 8 Octubre 2014, 06:58 am por free_c0de » En línea

La abstracción es la clave para lidiar con la complejidad.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cual es la longitud maxima de una variable por get.
PHP
SERBice 0 1,983 Último mensaje 29 Agosto 2007, 12:25 pm
por SERBice
Como hacer un array de longitud variable?
Programación C/C++
Y2J 3 7,619 Último mensaje 24 Agosto 2011, 02:30 am
por rir3760
Creo que ahora si me salio el array de longitud variable sin perder datos
Programación C/C++
Y2J 2 2,635 Último mensaje 25 Agosto 2011, 02:53 am
por Y2J
No recibo la variable num_usuario de archivo js a archivo php
Java
madri09 0 1,892 Último mensaje 4 Octubre 2012, 10:01 am
por madri09
Variable de longitud fija
.NET (C#, VB.NET, ASP)
luis456 3 3,780 Último mensaje 4 Febrero 2015, 21:33 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines