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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con memcpy() [SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con memcpy() [SOLUCIONADO]  (Leído 3,402 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Problema con memcpy() [SOLUCIONADO]
« en: 22 Noviembre 2013, 16:05 pm »

Hola a todos.

Tengo un vector de punteros a char.
Quiero leer todas las líneas de un fichero y almacenar cada una de ellas en cada componente de mi vector de punteros.
No conozco a priori el tamaño del fichero.

El problema es que, no se por qué, al redimensionar el vector de punteros voy perdiendo las cadenas almacenadas. Este es mi código:

Código:
#define readErr(ifs) ifs.rdstate() & ifstream::failbit

char ** readFich(ifstream &ifs,const int &BUFFER_S){
char line[BUFFER_S];
char **dev=new char*[1],**aux=NULL;
//dev = vector de strings donde almaceno cada linea del texto.
//aux = var. auxiliar para apuntar a dev mientras ésta es redimensionada.
int i=1;
//leo línea
ifs.getline(line,BUFFER_S);
        //la copio en el vector
        dev[i]=new char[BUFFER_S];
        strcpy(dev[i],line);
        while(!ifs.eof()){
        //Compruebo que no hay errores, si los hay, salgo del bucle.
        if (readErr(ifs)!= 0){
            cout<<"ERROR: INTENTANDO LEER MAS DE 256 CARACTERES"<<endl;
            break;
        }else{
            //libero la memoria a la que apuntaba aux
            delete[] aux;
            //salvo la direcc. de memoria de dev
            aux=dev;
            //redimensiono dev
            dev=new char*[i+1];
            //le paso los datos que tenia hasta ahora
            memcpy(dev,aux,sizeof(aux));
            //le asigno la nueva linea
            dev[i]=new char[BUFFER_S];
            strcpy(dev[i],line);
            //vuelvo a leer
            ifs.getline(line, BUFFER_S);
        }
        i++;
    }
    return dev;
}

No entiendo cual es el problema, ¿Qué puedo hacer?

Muchas gracias


« Última modificación: 22 Noviembre 2013, 19:24 pm por SARGE553413 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Leer fichero y "trocearlo"
« Respuesta #1 en: 22 Noviembre 2013, 18:29 pm »

Tengo un vector de punteros a char.
Quiero leer todas las líneas de un fichero y almacenar cada una de ellas en cada componente de mi vector de punteros.
No conozco a priori el tamaño del fichero.

El problema es que, no se por qué, al redimensionar el vector de punteros voy perdiendo las cadenas almacenadas.
Cuando utilizas el operador new este reserva un bloque de memoria del tamaño apropiado, nada mas. El problema es que tu esperas que copie el contenido del bloque anterior y eso no lo hará el operador. Debes hacerlo manualmente reservando un nuevo bloque de memoria, copiando en el las direcciones de memoria y finalmente liberando el bloque original (y utilizando a partir de ese momento el nuevo bloque).

¿Qué puedo hacer?
Ya que el lenguaje es C++ es mejor utilizar un vector de objetos de tipo string para almacenar todas las lineas del archivo, con ello te liberas del manejo de memoria.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Leer fichero y "trocearlo"
« Respuesta #2 en: 22 Noviembre 2013, 18:54 pm »

Cuando utilizas el operador new este reserva un bloque de memoria del tamaño apropiado, nada mas. El problema es que tu esperas que copie el contenido del bloque anterior y eso no lo hará el operador. Debes hacerlo manualmente reservando un nuevo bloque de memoria, copiando en el las direcciones de memoria y finalmente liberando el bloque original (y utilizando a partir de ese momento el nuevo bloque).
Sí, lo sé, de hecho en el código que he escrito lo hago explicitamente con una variable auxiliar y memcpy(), por eso no entiendo que pasa.

Citar
Ya que el lenguaje es C++ es mejor utilizar un vector de objetos de tipo string para almacenar todas las lineas del archivo, con ello te liberas del manejo de memoria.
Cierto, pero esto no me lo permiten hacer usando la STL, tengo que manejar la memoria directamente. Además es algo que quiero entender como funciona.
En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Leer fichero y "trocearlo"
« Respuesta #3 en: 22 Noviembre 2013, 19:08 pm »

He estado haciendo mas pruebas y sustituyendo la parte del memcpy() por un bucle for todo funciona bien.

Código:
//Antes:
            //vuelvo a leer
            ifs.getline(line, BUFFER_S,'\n');
            //salvo la direcc. de memoria de dev
            aux=dev;
            //redimensiono dev
            dev=new char*[i+2];
            //le paso los datos que tenia hasta ahora
            memcpy(dev,aux,sizeof(aux));
            //le asigno la nueva linea
            dev[i]=new char[BUFFER_S];
            strcpy(dev[i],line);
            //libero la memoria a la que apuntaba aux
            delete[] aux;

//Después:
            //vuelvo a leer
            ifs.getline(line, BUFFER_S,'\n');
            //salvo la direcc. de memoria de dev
            aux=dev;
            //redimensiono dev
            dev=new char*[i+2];
            //le paso los datos que tenia hasta ahora
            for(int j=0;j<i;j++){
                dev[j]=aux[j];
            }
            //le asigno la nueva linea
            dev[i]=new char[BUFFER_S];
            strcpy(dev[i],line);
            //libero la memoria a la que apuntaba aux
            delete[] aux;

Algo pasa con el memcpy(), ¿Qué es?

Saludos
En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Leer fichero y "trocearlo"
« Respuesta #4 en: 22 Noviembre 2013, 19:23 pm »

Solución:

En la parte en la que se especifica sizeof() en memcpy, hay que multiplicarlo por la cantidad de chars (en este caso) que se quieren copiar.

Esto es porque si tienes un vector de 20 caracteres 'char c[20]', sizeof(c) devuelve 4 (tamaño del puntero a char, que es lo que es en realidad el vector) no devuelve los 20 chars que contiene.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] Problema con IIS
.NET (C#, VB.NET, ASP)
ReneDgo 3 6,559 Último mensaje 11 Junio 2009, 18:26 pm
por ReneDgo
[SOLUCIONADO]Problema con FOR
Java
THANAT0S 2 2,805 Último mensaje 10 Febrero 2011, 15:07 pm
por THANAT0S
que problemas puede causar memcpy al introducir un buffer de datos en un struct
Programación C/C++
marvic 2 2,982 Último mensaje 8 Octubre 2012, 14:32 pm
por do-while
Problema de tiempo con memcpy. « 1 2 »
Programación C/C++
SARGE553413 15 6,397 Último mensaje 25 Julio 2014, 12:38 pm
por SARGE553413
¿como evito bugs usando argv y memcpy?
Programación C/C++
otroWeyMas.nasm 2 2,765 Último mensaje 17 Abril 2022, 02:56 am
por otroWeyMas.nasm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines