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

 

 


Tema destacado: Estamos en la red social de Mastodon


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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ayuda con fgets y arrays
« 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;

}


En línea

jomag

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #1 en: 23 Enero 2014, 00:10 am »

Solucionado, tenia que reservar espacio para el array de punteros:

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


En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #2 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:
En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #3 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
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
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #4 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.
En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #5 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?
7.7b What's wrong with casting malloc's return value?

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
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #6 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?
7.7b What's wrong with casting malloc's return value?

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.
En línea


rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #7 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
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
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Ayuda con fgets y arrays
« Respuesta #8 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
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arrays con clases? [AYUDA]
Programación Visual Basic
EstoyBaneado 5 2,252 Último mensaje 13 Septiembre 2005, 17:58 pm
por EstoyBaneado
ayuda con los arrays!!!
Programación C/C++
lourdes 7 4,408 Último mensaje 7 Enero 2011, 18:04 pm
por Littlehorse
Duda con arrays dentro de arrays « 1 2 »
PHP
Servia 11 7,214 Último mensaje 10 Marzo 2011, 09:04 am
por Servia
Ayuda con arrays « 1 2 »
Programación C/C++
norris 10 4,957 Último mensaje 18 Noviembre 2012, 19:58 pm
por norris
Ayuda con fprintf y fgets [Solucionado]
Programación C/C++
Luchoz95 5 4,490 Último mensaje 21 Abril 2013, 17:31 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines