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:
';' 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."); }
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
while( !feof(fd
) ){ // mientras no sea fin de archivo, leer un caracter.
if( c == ';'){
contC++;
if(contC==2){ // Ya llegue al inicio del campo email.
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;
}
email[ie] = '\0';
contacto[i] = '\0';
}
}
}
}
}
if( c == '^'){ // Fin de registro, reinicio el contador de campos.
contC = 0;
}
} // Fin de while
}
}
El resultado al ejecutar el programa es este...
@@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
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."); }
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;
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.
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;
}
}
if((c=='@') && (c != EOF)){
i=0;
ie = 0; // indice de email
while((c!='^') && (c != EOF)){
email[ie++] = c;
contacto[i++] = c;
}
if( (c == '^') && (c != EOF))
contC = 0;
email[ie] = '\0';
contacto[i] = '\0';
printf("%s%s\n",user
,contacto
); }
}
}
}
}
} // Fin de while
}
}
Espero te sirva.
Saludos.
Drewermerc.
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."); }
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;
while( !feof(fd
)){ // Para recorrer todo el archivo
//mover el puntero/cursor hasta el campo de email.
while(contC<2 && (c != EOF)){
if( c == ';'){
contC++;
}
}
// para capturar parcialmente el correo (userX@)
while(c!='@' && (c != EOF)){
contacto[i++] = c;
}
contacto[i++] = '\0';
if(c=='@' && (c != EOF)){//comienzo a capturar el dominio
ie=0;
while(c!='^' && (c != EOF)){
email[ie++] = c;
}
email[ie] = '\0';
}
// reinicio mi indice y contC para usar los arreglos
// para el siguiente registro.
i=0;
contC = 0;
//Comparo e imprimo
printf("%s%s\n",contacto
,email
); }
}// Fin while
}
}
Nuevamente gracías, ya nos leeremos en otra oportunidad.
Saludos :D