newsf@nospam_grupalia.com
2004-04-20 17:06:11 UTC
Hola grupo, estoy haciendo un programa en el que leo los siguientes datos
datos de un fichero externo llamado "entrada.txt"
primeralinea 2
segundalinea 8
terceralinea 9
primeralinea 1
ultimalinea 7
Estos datos los meto en una estructura que dentro tiene un puntero y un
entero. Mi problema es que cuando intento recorrer lo introducido en el
puntero, me sale siempre la información de lo último que he metido.
Si sustituyo el puntro por un array todo funciona perfectamente. He creado
el siguiente programa en el que te da el resutlado con el puntero y si
comentas la líneas del puntero y descomentas las comentadas, te la el
resultado con el array.
Supongo que tengo un problema de concepto.
Alguien me puede echar una mano, gracias.
Fernando
Ejemplo:
#include <stdio.h>
#include <string.h>
main ()
{
FILE *f_in; /*fichero origen*/
char *leido, c;
int i=0, i1=0, cl=0;
struct ordenar
{
char *p_correo;
// char correo[100];
int n;
};
if ((f_in = fopen ("entrada.txt", "r")) == NULL) //Abro el fichero
{
printf ("Error de apertura del fichero entrada.txt\n");
exit (1);
}
if((leido = (char *)malloc(100 * sizeof(char))) == NULL) //Lo pongo en
memoria dinamica y compruebo que hay memoria Heap.
{
printf ("No hay mas memoria en el Heap");
exit(1);
}
do //Para contar las líneas que tiene el fichero
{
c = getc(f_in);
if (c == '\n') cl++;
}while (feof(f_in) == 0);
rewind(f_in); // Rebobino y dejo el cursor al principio del fichero.
struct ordenar linea[cl];
do
{
fgets(leido,100,f_in);
linea[i].p_correo = strtok(leido, "\t\n");
//strcpy (linea[i].correo, strtok(leido, "\t\n"));
linea[i].n = atoi(strtok(NULL, "\t\n"));
printf ("%s\t%d\ti = %d\n", linea[i].p_correo, linea[i].n, i);
//printf ("%s\t%d\ti = %d\n", linea[i].correo, linea[i].n, i);
i++;
} while (feof(f_in) == 0);
printf ("posicion 0 =%s\t%d\n", linea[0].p_correo, linea[0].n);
printf ("posicion 1 =%s\t%d\n", linea[1].p_correo, linea[1].n);
printf ("posicion 2 =%s\t%d\n", linea[2].p_correo, linea[2].n);
printf ("posicion 3 =%s\t%d\n", linea[3].p_correo, linea[3].n);
printf ("posicion 4 =%s\t%d\n", linea[4].p_correo, linea[4].n);
//printf ("posicion 0 =%s\t%d\n", linea[0].correo, linea[0].n);
//printf ("posicion 1 =%s\t%d\n", linea[1].correo, linea[1].n);
//printf ("posicion 2 =%s\t%d\n", linea[2].correo, linea[2].n);
//printf ("posicion 3 =%s\t%d\n", linea[3].correo, linea[3].n);
//printf ("posicion 4 =%s\t%d\n", linea[4].correo, linea[4].n);
}
datos de un fichero externo llamado "entrada.txt"
primeralinea 2
segundalinea 8
terceralinea 9
primeralinea 1
ultimalinea 7
Estos datos los meto en una estructura que dentro tiene un puntero y un
entero. Mi problema es que cuando intento recorrer lo introducido en el
puntero, me sale siempre la información de lo último que he metido.
Si sustituyo el puntro por un array todo funciona perfectamente. He creado
el siguiente programa en el que te da el resutlado con el puntero y si
comentas la líneas del puntero y descomentas las comentadas, te la el
resultado con el array.
Supongo que tengo un problema de concepto.
Alguien me puede echar una mano, gracias.
Fernando
Ejemplo:
#include <stdio.h>
#include <string.h>
main ()
{
FILE *f_in; /*fichero origen*/
char *leido, c;
int i=0, i1=0, cl=0;
struct ordenar
{
char *p_correo;
// char correo[100];
int n;
};
if ((f_in = fopen ("entrada.txt", "r")) == NULL) //Abro el fichero
{
printf ("Error de apertura del fichero entrada.txt\n");
exit (1);
}
if((leido = (char *)malloc(100 * sizeof(char))) == NULL) //Lo pongo en
memoria dinamica y compruebo que hay memoria Heap.
{
printf ("No hay mas memoria en el Heap");
exit(1);
}
do //Para contar las líneas que tiene el fichero
{
c = getc(f_in);
if (c == '\n') cl++;
}while (feof(f_in) == 0);
rewind(f_in); // Rebobino y dejo el cursor al principio del fichero.
struct ordenar linea[cl];
do
{
fgets(leido,100,f_in);
linea[i].p_correo = strtok(leido, "\t\n");
//strcpy (linea[i].correo, strtok(leido, "\t\n"));
linea[i].n = atoi(strtok(NULL, "\t\n"));
printf ("%s\t%d\ti = %d\n", linea[i].p_correo, linea[i].n, i);
//printf ("%s\t%d\ti = %d\n", linea[i].correo, linea[i].n, i);
i++;
} while (feof(f_in) == 0);
printf ("posicion 0 =%s\t%d\n", linea[0].p_correo, linea[0].n);
printf ("posicion 1 =%s\t%d\n", linea[1].p_correo, linea[1].n);
printf ("posicion 2 =%s\t%d\n", linea[2].p_correo, linea[2].n);
printf ("posicion 3 =%s\t%d\n", linea[3].p_correo, linea[3].n);
printf ("posicion 4 =%s\t%d\n", linea[4].p_correo, linea[4].n);
//printf ("posicion 0 =%s\t%d\n", linea[0].correo, linea[0].n);
//printf ("posicion 1 =%s\t%d\n", linea[1].correo, linea[1].n);
//printf ("posicion 2 =%s\t%d\n", linea[2].correo, linea[2].n);
//printf ("posicion 3 =%s\t%d\n", linea[3].correo, linea[3].n);
//printf ("posicion 4 =%s\t%d\n", linea[4].correo, linea[4].n);
}