REALLOC
Hola, tengo un problemilla. Tengo que asignar a cada dirección ip de un fichero una posición dentro de un array. Se que hay que hacerlo con memoria dinámica puesto que no sé cual puede ser el tamaño del array. He simplificado un poco el problemilla, pero el código no me va, no se si es que no entiendo la función realloc() o que. Os adjunto el código haber si le podeis echar un vistacillo y decirme en q falla.MUCHAS GRACIAS
-------PROGRAMA----------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
//Declaración de variables.
char **direcciones;
char dir[20];
int i;
FILE *origen;
int N=0;
int encontrado, indice, tam;
//**direcciones=NULL;
//Apertura de ficheros.
origen=fopen("prueba.txt", "r");
if(origen == NULL)
{
printf("n ERROR: no se puede abrir el archivo.n");
}
//Bucle principipal, que ira recorriendo todo el fichero hasta su final.
fgets(dir,20,origen);
//printf("n%s",dir);
direcciones=(char **)calloc(1,sizeof(char));
N=0;
tam=strlen(dir);
direcciones[N]=(char *)calloc(tam,sizeof(char));
i=0;
strcpy(direcciones[N],dir);
printf("Leo:%s",dir);
N++;
while (!feof(origen))
{
fgets(dir,20,origen);
printf("n Leo:%s",dir);
encontrado=0;
i=0;
while((i<N)&&(encontrado==0))
{
printf("ntEntro while|");
printf("tMatriz:%s", direcciones[i]);
if (strcmp(dir,direcciones[i])==0)
{
printf("Iguales");
encontrado=1;
//indice=i;
}
else
{
i++;
}
}
if (encontrado==0)
{
printf("Inserto");
//Insertamos las direcciones en un array dinámico. Su valor será sustituido por el índice del array.
direcciones=(char**) realloc((char**)direcciones,(N)*sizeof(char));
printf("nHe insertado");
tam=strlen(dir);
direcciones[N]=(char *)calloc(tam,sizeof(char));
printf("nHe insertado2");
strcpy(direcciones[N],dir);
printf("nHe copiado");
N++;
}
printf("nHe salido de insertar");
/*for(i=0;i<N;i++)
{
printf("n For:Dir:%s Indice:%d",direcciones[i], i);
}*/
}
for(i=0;i<=N;i++)
{
printf("n For:Dir:%s Indice:%d",direcciones[i],i);
}
//Cerramos los ficheros.
if(fclose(origen)!=0)
{
printf("ERROR:problemas al cerrar el fichero.n");
}
------------FICHERILLO PRUEBA.TXT
192.168.0.1
198.45.6.9
192.168.0.1
198.45.6.9
192.168.0.1
178.4.5.6
25.6.7.8
1178.4.5.6
-------PROGRAMA----------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
//Declaración de variables.
char **direcciones;
char dir[20];
int i;
FILE *origen;
int N=0;
int encontrado, indice, tam;
//**direcciones=NULL;
//Apertura de ficheros.
origen=fopen("prueba.txt", "r");
if(origen == NULL)
{
printf("n ERROR: no se puede abrir el archivo.n");
}
//Bucle principipal, que ira recorriendo todo el fichero hasta su final.
fgets(dir,20,origen);
//printf("n%s",dir);
direcciones=(char **)calloc(1,sizeof(char));
N=0;
tam=strlen(dir);
direcciones[N]=(char *)calloc(tam,sizeof(char));
i=0;
strcpy(direcciones[N],dir);
printf("Leo:%s",dir);
N++;
while (!feof(origen))
{
fgets(dir,20,origen);
printf("n Leo:%s",dir);
encontrado=0;
i=0;
while((i<N)&&(encontrado==0))
{
printf("ntEntro while|");
printf("tMatriz:%s", direcciones[i]);
if (strcmp(dir,direcciones[i])==0)
{
printf("Iguales");
encontrado=1;
//indice=i;
}
else
{
i++;
}
}
if (encontrado==0)
{
printf("Inserto");
//Insertamos las direcciones en un array dinámico. Su valor será sustituido por el índice del array.
direcciones=(char**) realloc((char**)direcciones,(N)*sizeof(char));
printf("nHe insertado");
tam=strlen(dir);
direcciones[N]=(char *)calloc(tam,sizeof(char));
printf("nHe insertado2");
strcpy(direcciones[N],dir);
printf("nHe copiado");
N++;
}
printf("nHe salido de insertar");
/*for(i=0;i<N;i++)
{
printf("n For:Dir:%s Indice:%d",direcciones[i], i);
}*/
}
for(i=0;i<=N;i++)
{
printf("n For:Dir:%s Indice:%d",direcciones[i],i);
}
//Cerramos los ficheros.
if(fclose(origen)!=0)
{
printf("ERROR:problemas al cerrar el fichero.n");
}
------------FICHERILLO PRUEBA.TXT
192.168.0.1
198.45.6.9
192.168.0.1
198.45.6.9
192.168.0.1
178.4.5.6
25.6.7.8
1178.4.5.6
Si puedes hacer lo mismo en C++, acá abajo pongo una forma alternativa. La ventaja es que tanto "vector" como "string" ajustan su tamaño de acuerdo con lo que vayan necesitando:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
ifstream entrada("archivo.txt");
vector<string> direcciones;
char s[16];
// Lee desde el archivo:
do {
for(int i=0; i<4; ++i) {
entrada.getline(s,16);
direcciones.push_back(s);
}
} while (!entrada.eof() );
// Muestra por pantalla:
cout << "Archivo:nn";
copy (
direcciones.begin(),
direcciones.end(),
ostream_iterator<string>(cout, "n")
);
cout << "nnEnter para salir ..." ;
cin.get();
return 0;
}
// Alejandro
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
ifstream entrada("archivo.txt");
vector<string> direcciones;
char s[16];
// Lee desde el archivo:
do {
for(int i=0; i<4; ++i) {
entrada.getline(s,16);
direcciones.push_back(s);
}
} while (!entrada.eof() );
// Muestra por pantalla:
cout << "Archivo:nn";
copy (
direcciones.begin(),
direcciones.end(),
ostream_iterator<string>(cout, "n")
);
cout << "nnEnter para salir ..." ;
cin.get();
return 0;
}
// Alejandro
