• Viernes 15 de Noviembre de 2024, 19:35

Autor Tema:  Lenguaje C: fscanf  (Leído 2018 veces)

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Lenguaje C: fscanf
« en: Jueves 15 de Abril de 2010, 12:39 »
0
Hola, quería preguntaros si veis algún error en la siguiente instrucción:

Código: C
  1. while (fscanf(punteroF,"%s %s %s",aux[0],argv.fIn,argv.fOut) != EOF){
  2.         //Trato de cada línea
  3. }
  4.  

Lo que quiero hacer es leer hasta final de fichero línea a línea. Este fichero tiene en cada línea 3 palabras separadas por espacios. Leo la primea cadena y la guardo en la primera variable, leo la segunda, tras el espacio y la guardo en la segunda... y así con la tercera

punteroF es de tipo FILE, y es el valor devuelto al hacer un fopen() (que hace correctamente)
argv.fIn y argv.fOut son cadenas de caracteres (char cadena[100];)
aux[0] es la primera posición de una variable declarada como char *aux[2];

Mi problema es que al hacer está instrucción mi programa me da un fallo de segmentación, alguien podría ayudarme?

Gracias por adelantado  :hola:
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Lenguaje C: fscanf
« Respuesta #1 en: Jueves 15 de Abril de 2010, 19:06 »
0
estas reservando la memoria para aux[0]?

aux[0] = (char *)malloc(sizeof(char)*X); //X es la cantidad de elementos a reservar

Saludos
The sweet smell of a great sorrow lies over the land.


ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Lenguaje C: fscanf
« Respuesta #2 en: Jueves 15 de Abril de 2010, 19:55 »
0
Cita de: "zany_666"
aux[0] es la primera posición de una variable declarada como char *aux[2];


Fallo de segmentación  indica corrupcion de memoria.

Dices que tienes declarada una variable como char *aux[2], (osea, un puntero a char).

Yo creo que puede ser una de dos cosas:

1. No le has asignado espacio de memoria a la variable mediante malloc o new, el que tu declares una variable como puntero a char no significa que el compilador automaticamente asigne espacio, al declarar la variable como char * solo estas asignando espacio para el apuntador, mas no estas asignando espacio para el lugar donde apunta el apuntador, no se si me explique. Como no asignas espacio, el apuntador apunta a cualquier parte, y entonces al querer guardar algo en la variable, corrompes la memoria

2. Si solo asignaste espacio para 2 caracteres, y la cadena que lees tiene mas de 2, entonces seguira leyendo el resto de datos, corrompiendo la memoria. Ademas recuerda que las cadenas requieren un caracter nulo al final de la cadena, si tu cadena tiene longitud de 2, necesitas en realidad espacio para 3, 2 y el caracter nulo de fin de cadena. Si tu cadena tiene longitud 3, necesitas espacio para 4, y as sucesivamente.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

zany_666

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: es
    • Ver Perfil
Re: Lenguaje C: fscanf
« Respuesta #3 en: Viernes 16 de Abril de 2010, 13:17 »
0
Hola, muchas gracias por las respuestas.

He probado con:
Código: C
  1. aux[0] = (char *)malloc(sizeof(char)*X);
  2.  

Y ya no aparece fallo de segmentación  :D
Me ha resultado muy extraño, pues tenía otro programa parecido y no tenia que reservar memoria con malloc.  :hola:
Una imágen vale más que mil palabras, pero ocupa mucha más memoria...