Autor
|
Tema: Problema con memcpy() [SOLUCIONADO] (Leído 3,402 veces)
|
SARGE553413
Desconectado
Mensajes: 176
|
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: #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
Mensajes: 1.639
|
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
Mensajes: 176
|
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. 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
Mensajes: 176
|
He estado haciendo mas pruebas y sustituyendo la parte del memcpy() por un bucle for todo funciona bien. //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
Mensajes: 176
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[SOLUCIONADO] Problema con IIS
.NET (C#, VB.NET, ASP)
|
ReneDgo
|
3
|
6,559
|
11 Junio 2009, 18:26 pm
por ReneDgo
|
|
|
[SOLUCIONADO]Problema con FOR
Java
|
THANAT0S
|
2
|
2,805
|
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
|
8 Octubre 2012, 14:32 pm
por do-while
|
|
|
Problema de tiempo con memcpy.
« 1 2 »
Programación C/C++
|
SARGE553413
|
15
|
6,397
|
25 Julio 2014, 12:38 pm
por SARGE553413
|
|
|
¿como evito bugs usando argv y memcpy?
Programación C/C++
|
otroWeyMas.nasm
|
2
|
2,765
|
17 Abril 2022, 02:56 am
por otroWeyMas.nasm
|
|