Ayuda con fgets y arrays

Iniciado por jomag, 22 Enero 2014, 20:14 PM

0 Miembros y 3 Visitantes están viendo este tema.

jomag

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:

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;

}

jomag

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

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

dato000

Cita de: 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));


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:



rir3760

Cita de: dato000 en 23 Enero 2014, 17:05 PMpensaba 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
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

Cita de: rir3760 en 23 Enero 2014, 17:15 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...

Cita de: rir3760 en 23 Enero 2014, 17:15 PM
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.



rir3760

Cita de: dato000 en 23 Enero 2014, 17:45 PMNo 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:
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
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

Cita de: rir3760 en 23 Enero 2014, 18:06 PM
Habría (lo digo en buen plan) que revisar esos libros con cuidado.

Lo usual cuando se utiliza la función malloc es:
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.



rir3760

Cita de: dato000 en 23 Enero 2014, 18:30 PMyo 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.


Cita de: dato000 en 23 Enero 2014, 18:30 PMhasta en cplusplus veo referencias de conversión
Cierto pero ese sitio esta enfocado en C++ y en este la conversión es requerida.


Cita de: dato000 en 23 Enero 2014, 18:30 PMen 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
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

Cita de: rir3760 en 24 Enero 2014, 16:52 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