Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jomag en 22 Enero 2014, 20:14 pm



Título: Ayuda con fgets y arrays
Publicado por: jomag en 22 Enero 2014, 20:14 pm
Hola, estoy intentando de escribir código para almacenar cada linea de un fichero en una array de punteros de cadenas. Para leer cada linea del fichero utilizo la función fgets y después asigno cada linea a una posición de mi array de punteros cadena. Si pudierais echarle un vistazo os lo agradeceria mucho, porque mi problema es que todas las posiciones de mi array de punteros acaba con la ultima linea del fichero, es decir sobrescribe todas las posiciones con la ultima linea. Os dejo el codigo:

Código:
int parse_probes() {

FILE* pf;
char buf[100];
char *probes[100];
int i;

if ((pf = fopen(
"/archivo", "r"))
== NULL) {
puts("Error abriendo archivo");
exit(1);
}
for (i = 0; i < 10; i++) {
if (fgets(buf, MX, pf) != NULL) {
probes[i] = buf;
printf("%d %s %s \n", i, probes[i], probes[0]);

}
}
fclose(pf);
return 0;

}


Título: Re: Ayuda con fgets y arrays
Publicado por: jomag en 23 Enero 2014, 00:10 am
Solucionado, tenia que reservar espacio para el array de punteros:

         probes = malloc((strlen(buf)+1) * sizeof(char));


Título: Re: Ayuda con fgets y arrays
Publicado por: dato000 en 23 Enero 2014, 17:05 pm
Solucionado, tenia que reservar espacio para el array de punteros:

         probes = malloc((strlen(buf)+1) * sizeof(char));


umm pensaba que tenia que convertirse esa sentencia al tipo de variable al que se le tiene que reservar memoria pues malloc o calloc devuelven un valor tipo void, pero ya lo probe y  funciona, supongo que el mismo compilador realiza la conversión para evitar inconvenientes.

bien por ti, te superas solito  :laugh: :laugh:


Título: Re: Ayuda con fgets y arrays
Publicado por: rir3760 en 23 Enero 2014, 17:15 pm
pensaba que tenia que convertirse esa sentencia al tipo de variable al que se le tiene que reservar memoria pues malloc o calloc devuelven un valor tipo void, pero ya lo probe y  funciona, supongo que el mismo compilador realiza la conversión para evitar inconvenientes.
Depende del lenguaje.

En C no es necesaria (y no se recomienda) la conversión de un puntero de tipo "void *" al tipo apropiado.

En C++ es obligatoria la conversión pero en lugar de malloc y calloc se recomienda el uso del operador new ya que este llama al constructor del objeto y resulta en un puntero del tipo correcto.

Un saludo


Título: Re: Ayuda con fgets y arrays
Publicado por: dato000 en 23 Enero 2014, 17:45 pm
Depende del lenguaje.

En C no es necesaria (y no se recomienda) la conversión de un puntero de tipo "void *" al tipo apropiado.

No se recomienda???, yo habia leido justo lo contrario en un libro de johanes aguilar, y ese tipo esta al nivel de Deitel...

En C++ es obligatoria la conversión pero en lugar de malloc y calloc se recomienda el uso del operador new ya que este llama al constructor del objeto y resulta en un puntero del tipo correcto.

Un saludo

por supuesto en eso tienes toda la razón, solo que aún no he llegado a ese punto, todavia sigo con C, voy a mi propio ritmo y analizar muy bien esas cosas.


Título: Re: Ayuda con fgets y arrays
Publicado por: rir3760 en 23 Enero 2014, 18:06 pm
No se recomienda???, yo habia leido justo lo contrario en un libro de johanes aguilar, y ese tipo esta al nivel de Deitel...
Habría (lo digo en buen plan) que revisar esos libros con cuidado.

Lo usual cuando se utiliza la función malloc es:
Código
  1. p = malloc(NUM_ELEM * sizeof *p);
Donde NUM_ELEM es el numero de elementos y "sizeof *p" indica el tamaño del objeto apuntado.

Mas información en las paginas (en ingles):
7.7 Why does some code carefully cast the values returned by malloc to the pointer type being allocated? (http://c-faq.com/malloc/cast.html)
7.7b What's wrong with casting malloc's return value?  (http://c-faq.com/malloc/mallocnocast.html)

Un saludo


Título: Re: Ayuda con fgets y arrays
Publicado por: dato000 en 23 Enero 2014, 18:30 pm
Habría (lo digo en buen plan) que revisar esos libros con cuidado.

Lo usual cuando se utiliza la función malloc es:
Código
  1. p = malloc(NUM_ELEM * sizeof *p);
Donde NUM_ELEM es el numero de elementos y "sizeof *p" indica el tamaño del objeto apuntado.

Mas información en las paginas (en ingles):
7.7 Why does some code carefully cast the values returned by malloc to the pointer type being allocated? (http://c-faq.com/malloc/cast.html)
7.7b What's wrong with casting malloc's return value?  (http://c-faq.com/malloc/mallocnocast.html)

Un saludo

yo defiendo a johanes aguilar, es un muy buen autor, me ha sacado más de una vez de un apuro.

hasta en cplusplus veo referencias de conversión, en cuanto a los retornos de malloc, es justamente por eso que detesto malloc, porque no inicializa las posiciones de memoria que reserva, por eso prefiero calloc, que las inicializa a cero, para no tener errores de segmentación al momento de referenciar esas posiciones de memoria.

http://www.cplusplus.com/reference/cstdlib/malloc/

Citar
function
<cstdlib>

malloc

void* malloc (size_t size);

Allocate memory block
 Allocates a block of size bytes of memory, returning a pointer to the beginning of the block.

 The content of the newly allocated block of memory is not initialized, remaining with indeterminate values.

 If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.


Título: Re: Ayuda con fgets y arrays
Publicado por: rir3760 en 24 Enero 2014, 16:52 pm
yo defiendo a johanes aguilar, es un muy buen autor, me ha sacado más de una vez de un apuro.
No lo digo de forma despectiva ni como un ataque personal al autor, simplemente si es un libro de C y recomienda la conversión del retorno de malloc esta equivocado.


hasta en cplusplus veo referencias de conversión
Cierto pero ese sitio esta enfocado en C++ y en este la conversión es requerida.


en cuanto a los retornos de malloc, es justamente por eso que detesto malloc, porque no inicializa las posiciones de memoria que reserva, por eso prefiero calloc, que las inicializa a cero, para no tener errores de segmentación al momento de referenciar esas posiciones de memoria.
Si el bloque debe reservarse e inicializarse a cero se llama a calloc, si el contenido no importa se llama a malloc, al final del día cual de las dos utilizar depende del programa.

Un saludo


Título: Re: Ayuda con fgets y arrays
Publicado por: dato000 en 24 Enero 2014, 18:39 pm

Si el bloque debe reservarse e inicializarse a cero se llama a calloc, si el contenido no importa se llama a malloc, al final del día cual de las dos utilizar depende del programa.

Un saludo

Diras del programador  :silbar: :silbar:

vale ya entiendo el punto

slds