[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