[C con Clase] vector de string en c sin saber tamaño.

Agustin agscontini en gmail.com
Lun Abr 6 01:44:24 CEST 2009


Steven...
 Gracias por la respuesta. Me aclaraste muchas cosas con respecto al tema de memoria dinámica y punteros. No use listas porque como dije a un compañero le dije que para trabajar con mi comentario auto le había dicho que lo cargaba en un  vector, para la próxima asi va a ser mi primer elección.
 Ahora creo tener el definitivo, espero que asi vaya y funcione. Pongo el código por última vez porque ya me van a querer matar si sigo colgando código, pero quiero ver si hay algo mal o algo que no interprete bien de asignación de memoria y demás.

void levantar_auto(FILE * archivo_origen)
char * linea;            /*para cargar una linea del archivo origen*/
char * temp;             /* para cargar temporalmente parte de una linea*/
int num_linea = 0;       /*para saber el número de linea que levanto*/
int i;                   /*contador para linea temp*/
int nCadenas;            /*contador lineas escritas en vec*/
size_t = tam_linea;      /* para ver tamaño de string*/
char ** array            /* ¿array de string a cargar?? */
{
While(! feof(archivo_origen)) /*voy a leer todo el archivo y levantar de */
 {                              /*a un auto y tratarlo como necesite*/
   getstring(archivo_origen, linea); /*me levanta un renglon en linea*/
   num_linea++                       /*leí una linea asi que contador aumenta*/
   If (strstr(linea,"/**")!= NULL)   /*si encuentra el inicio de AUTO...*/
   {
	nCadenas = 0;                     /* cadenas en vector*/
	array = (char *) malloc(sizeof (char *));  /*para una cadena*/
    Do
     {
      getstring(archivo_origen,linea); /*leo la siguiente linea y la levanto*/
      num_linea++;                      /*aumento el contador*/
      if (strstr(linea,"*/")==NULL)    /* sino esta cerrado en esta linea*/
        {
    	  tam_linea = strlen(linea);
    	  nCadenas++;               /*aumento el contador de cadenas a vector*/
    	  if (nCadenas >1)    /*si va por la primera ya le hice una reserva*/  /*inicial  asi que no entro sino entro y reservo más memoria*/

    	  {
    		  array = (char *) realloc( ++nCadenas * sizeof(char *) ); /*le reservo más memoria a mi vector*/
    	  }
    	  array[nCadenas - 1]= (char*) malloc(tam_linea);   /*reservo memoria para mi linea*/

    	  strcpy(array[nCadenas - 1],linea);                /*copio al vector la linea*/

        }
     } While ((strstr(linea,"*/") == NULL)) && (! feof(archivo_origen)); /*que repita hasta cierre o fin de archivo*/
     /*La linea que cierra el comentario auto la ignoro*/
     Aca mando el vector auto cargado para que otro lo trabaje con una función y pueda buscar cosas que nos sirvan (errores y demás). Sino me equivoco ahí mismo me liberan la memoria pedida y usada por mi vector y los strings de adentro...sino lo tengo uqe hacer yo para volver a usarla para el próximo vector auto.
   }/*termino de cargar el comentario auto completo*/
 }/* termino de leer el archivo de origen*/
fclose (archivo_origen);           /*lo termine de usar asi que lo cierro*/
}/*termina la función*/

En caso de tomar la linea que cierra el comentario auto aplico esto donde digo que la ignoro.
 If (! feof(archivo_origen))        /*si salio poruqe encontro el cierre...*/
         {
    	 nCadena++;
    	 if (nCadenas >1)            /*si va por la primera ya le hice una reserva inicial asi que no entro*/
    	     	  {
    	     		  array = (char *) realloc( ++nCadenas * sizeof(char *) ); /*le reservo más memoria a mi vector*/
    	     	  }/*cierro el if de ncadenas*/
         For(i=0,linea(i)=="*/"; i++)  /*escribo el renglon hasta que cierra comen*/
         temp[i]= linea[i];       /*cargo hasta llegar al corte en temp */
         array[nCadena - 1] = (char *) malloc(i);    /*reservo para el renglon que tiene el cierre*/
         strcpy(array[nCadena -1], temp);       /*lo escribo en la sig pos del vector*/
         }/*cierro el if de ! feof*/

Espero este sea el definitivo y haya entendido esto de punteros y demás. Muchas gracias a los que ya me dieron una mano y de antemano a quien me vaya a seguir ayudando.
 Saludos.
 



Más información sobre la lista de distribución Cconclase