Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/08/2013, 13:12
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Registro Estatico & Registro Dinamico en C

Indenta el codigo para que se vea mejor lo que estas haciendo.

Para separar los campos solo tienes que tokenizar por el caracter que quieras; echa un vistazo a tu manual de c para la funcion strtok: ojo, si vas a parsear mas de un texto simultaneamente con multiples procesos busca la funcion strtok_r que es la version reentrante de la strtok estandar (la funcion estandar no es segura en multiprocesos porque guarda datos).

Código C:
Ver original
  1. char texto[] = "campo1#campo2#campo3";
  2. char *pch;
  3.  
  4. pch = strtok(texto, "#");
  5. while(pch) {
  6.     printf("%s\n", pch);
  7.     pch = strtok(0, "#");
  8. }

Ten en cuenta una cosa: la funcion strtok modifica la cadena que le envias, por eso si necesitas reutilizar los datos sería una buena opcion hacer una copia y trabajar con eso.

Para cargar los archivos en memoria solo tienes que conocer su longitud, bloquear memoria para ese tamaño y leer el archivo; recuerda que tienes que liberar la memoria bloqueada cuando ya no la necesites. Para consultar el tamaño de un archivo tienes varias formas (a parte de las funciones que tengas en las api de cada s.o.): buscando el final del archivo o bien usando la funcion stat (ambas deberian darte lo mismo, pero la primera se usa cuando no conoces la ruta del archivo pero tienes un puntero abierto):

Código C:
Ver original
  1. size_t get_file_size(FILE *arx) {
  2.     size_t fs = 0;
  3.  
  4.     if(arx) {
  5.         fseek(arx, 0L, SEEK_END);
  6.         fs = ftell(arx);
  7.         fseek(arx, 0L, SEEK_SET);
  8.     }
  9.  
  10.     return fs;
  11. }

Ya tienes la funcion que te da el tamaño, solo tienes que abrir un puntero al archivo, usarlo con esta funcion, bloquear la memoria requerida y leer:

Código C:
Ver original
  1. FILE *arx;
  2. long unsigned int nb, nbr;
  3. char *buffer;
  4.  
  5. if((arx = fopen("datos.txt", "rb"))) {
  6.     if((nb = get_file_size(arx))) {
  7.         if((buffer = malloc(nb+1))) {
  8.             if((nbr = fread(buffer, nb, 1, arx)) == 1) {
  9.                 buffer[nb] = '\0';
  10.                 //aqui ya tienes todo el archivo en buffer
  11.                 //printf("%s", buffer);
  12.                 free(buffer);
  13.                 buffer = 0;
  14.             }
  15.         }
  16.     }
  17. }

(nota: los else de todos los 'if' son las condiciones de error, no las he puesto pero se la idea basica se entiende)

Una vez tienes el archivo lo tokenizas y vas populando la lista.

Saludos
vosk

p.s. que me olvido una cosa, el tipo size_t es una redefinicion de long unsigned int; te sirve para saber que tipos de datos esperan las funciones