• Sábado 4 de Mayo de 2024, 20:38

Autor Tema:  Prosesamiento De Archivos  (Leído 2761 veces)

alguien

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Prosesamiento De Archivos
« en: Domingo 10 de Abril de 2005, 07:33 »
0
Hola atodos una ves mas


  Mi problema es el sguiente devo incializar un archivo.dat a 200 registros
   se que se hace conel fwrite y el fseek pero ne se cual es la sitaxis exacta del
  fseek

  ya lo he intentado pero al ahora de introducir los datos apareecen sin orden alguno por todo el archivo



   lo que quiero es lo siguint inicializarlo con la sguit structura


     struct cliente{
                           char  nom_cliente[15];
                           int  carnet_cliente ;
                           char direccion[30];
                           char telfono[9];        
     } referencia;
 :scream:

   la idea es originar una tabla con campos vacios
   
 


   Gracias por su tiempo

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Prosesamiento De Archivos
« Respuesta #1 en: Domingo 10 de Abril de 2005, 10:03 »
0
Hola

Si lo unico que quieres es crear un archivo con 200 registros vacios , te basta con usar fwrite y hacer un bucle for de 200 iteraciones en las que escriba siempre una estructura NULL

De todas maneras no se por que dices que no te los coloca en orden, si todos los registros son iguales (vacios)

La sintaxis del fseek es:

Citar
int  fseek ( FILE * stream , long offset , int origin );

El primer argumento es el puntero a archivo abierto
El segundo es el desplazamiento que haras en el archivo en bytes
El tercero es un entero que puede tomar 3 valores
     -- 0 inicia el desplazamiento desde el principio del archivo
     -- 1 inicia el desplazamiento desde la posicion donde se quedo la ultima vez el puntero
     -- 2 inicia el desplazamiento desde el final del archivo

Espero que te sirva de ayuda

saludos  :hola:

alguien

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Prosesamiento De Archivos
« Respuesta #2 en: Domingo 10 de Abril de 2005, 17:25 »
0
el problema no es el orden al crear los 200 registros por que los crea
  el problema es a la hora de introducir un registro no lo hace en el primer espacio bacxio si no en desorden me entiendes devo implementar una secuencia que me introdusca lo datos en el archivo pero que los introdusca en el primer espacio vacio del archivo que ya hacido inicializado


  gracias por tu tiempo


 :smartass:

iori2029

  • Miembro activo
  • **
  • Mensajes: 48
    • Ver Perfil
Re: Prosesamiento De Archivos
« Respuesta #3 en: Domingo 10 de Abril de 2005, 18:42 »
0
Pues no entiendo bien tu problema.

Debes de meter los registros con fwrite no?
Ahora que no se si los inicializas a 0 todos los registros de tu estructura.
creo que seria algo asi

fwrite(&mistructura,sizeof(miestructura),1,miarchivo);

donde &miestructura la estas pasando por la direccion de memoria de esta &,
sizeof(miestructura) el tamaño que ocupa tu estructura, el 1 es que estas pasando
una sola estructura en cada vuelta de un bucle(si lo haces con un bucle, sino creo, no estoy seguro que puedas meter todas tus estructuras de golpe) y miarchivo es el archivo que tienes abierto( con un puntero FILE).

Ahora el fseek te sirve para posicionarte en una parte del archivo que tu elijas.

fseek(archivo,desplazamiento,origen) como dice Diodo,pero creo que fwrite se situa para escribir al principio del archivo por si solo no?

Yo creo que fseek seria para que buscaras un determinado registro o empezaras a escribir en determinada posicion del archivo.

Espero que te sirva de algo y no te enredes mas.

alguien

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Prosesamiento De Archivos
« Respuesta #4 en: Domingo 10 de Abril de 2005, 19:50 »
0
lo que hago al inicializar el archivo 200 registros es escrivir 200 espacios vacios dentrodel archivo lo que es igual a escrivir la estrcuctura 200 veces dentro de le archivo     es lo que tengo entendido
   
  veamoslo desde este punto de vista ya inicialice el archivo y ya cree lo 200
   registros ; Ahora deseo ingresar datos al registro y deseo hacerlo en el primer
   registro bacio que encuentre en el archivo

   es Aqui donde los datos no se escriben en el primer registro si no en otro que es mas omenos el 20 o mas la inquietud es porque esto sucede y no escrive esos
los datos en el primer registro acio que se encuentra


  implem,ente la siguint sentecia pero no fuciono

   fseek( puntr,SEEK_SET,0);
      while( referencia.carnet!=0 || !feof(pntr))
             fread(&refencia,sizeof( struct videos ),1,pntr);


  gracias por su tiempo
  :smartass:

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Prosesamiento De Archivos
« Respuesta #5 en: Lunes 11 de Abril de 2005, 10:34 »
0
Hola de nuevo

No se si es que en la practica o ejercicio te obligan, pero no veo la necesidad de crear los 200 registros en el fichero para luego escribir en el primero vacio.Los datos de un fichero no son como variables en memoria y no hace falta inicializarlos, simplemente se van colocando secuencialmente en el fichero, de ahi que luego haya que utilizar el puntero para recorrerlos y sacar los registros que creas oportunos.
Creo que lo que dice iori es verdad, y el puntero del fwrite se situa siempre al comienzo, y si no es asi , deberia situarse en el 200
De todas maneras si sabes exactamente que se te queda en el 20 puedes hacer:

Código: Text
  1. fseek(puntero,-20*sizeof(registro),1) // desplaza 20 registros desde la posicion actual
  2.  
  3. //o esto
  4.  
  5. fseek(puntero,0,0) // se pone al comienzo
  6.  
  7. //o tambien
  8.  
  9. fseek(puntero,-200*sizeof(registro),2) // retrocede 200 registros desde el final
  10.  

a ver si te sirve algun metodo

Ahhh y esta linea de tu codigo esta mal

Código: Text
  1. fseek( puntr,SEEK_SET,0); // SEEK_SET es el tercer parametro no el segundo
  2.  
  3. // deberia ser asi:
  4.  
  5. fseek( puntr,0,SEEK_SET);
  6.  

Para orientarte un poco mejor puedes usar la funcion ftell que retorna la posicion exacta del puntero su sintaxis es:

Código: Text
  1. long int ftell(FILE *stream); // devuelve un entero largo
  2.  

Tienes mas informacion sobre todas estas funciones aqui:

http://c.conclase.net/librerias/libreria.php?lib=stdio

saludos :hola:

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Prosesamiento De Archivos
« Respuesta #6 en: Lunes 11 de Abril de 2005, 13:47 »
0
Hola a todos,  :hola:
voy a poner un ejemplo de cómo manejar un fichero de forma aleatoria, algo sencillo como pedir al usuario que indique una posición y mostrársela, y permitir que cambie el registro.
Unos consejos:  :lightsabre:
No deberías llenar el archivo con espacios al inicio.
Si quieres añadir archivos al final del fichero una vez creado, lo puedes hacer abriendo el archivo de la sigte manera: fopen("archivo","a"); de esta forma se abre el archivo para añadir cosas al final, el apuntador apuntará al final del fichero.
El código de ejemplo es el sigte:  :lightsabre:
Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. typedef struct
  7. {
  8.   char nombre[100];
  9.   int telefono;
  10. }datos;
  11.  
  12. void main()
  13. {
  14.   int posicion;
  15.   char op;
  16.   FILE *pf;
  17.   datos ficha;
  18.  
  19.   pf=fopen("c:\\archivo.txt","r+");//abrir el fichero para leer y escribir
  20.  
  21.   if(pf==NULL)
  22.   {
  23.     printf("\n\aError abriendo el archivo.");
  24.     getchar();
  25.     return;
  26.   }
  27.  
  28.   fseek(pf,0L,SEEK_END);//lleva el apuntador del fichero al final
  29.   printf("\nTotal de registros: %d",(int)ftell(pf)/sizeof(ficha));//Muestra el nº total de registros en el fichero
  30.  
  31.   printf("\nRegistro a visualizar (1-%d): ",(int)ftell(pf)/sizeof(ficha));
  32.   scanf("%d",&posicion);
  33.  
  34.   rewind(pf);//corre el puntero del fichero al inicio no sería necesario...Para que se vean todas las fuciones
  35.   fseek(pf,sizeof(ficha)*(posicion-1),SEEK_SET);//se mueve el puntero hasta la posición que se ha pedido
  36.   fread(&ficha,sizeof(ficha),1,pf);
  37.   printf("\n\n\tNombre: %s\n\tTelefono: %d",ficha.nombre,ficha.telefono);
  38.   fflush(stdin);
  39.  
  40.   do
  41.   {
  42.     printf("\n\n\tDesea cambiar el registro? (s-n): ");
  43.     scanf("%c",&op);
  44.     fflush(stdin);
  45.     op=tolower(op);
  46.   }while(op!='s' && op!='n');
  47.  
  48.   if(op=='s')
  49.   {
  50.     printf("\n\n\tIntroduce nuevo nombre: ");
  51.     gets(ficha.nombre);
  52.     printf("\n\tTelefono: ");
  53.     scanf("%d",&ficha.telefono);
  54.     fseek(pf,-(signed)sizeof(ficha),SEEK_CUR);//retroceder un registro a partir del que estamos pq al hacer fwrite nos hemos movido una posición hacia delante.
  55.     fwrite(&ficha,sizeof(ficha),1,pf);
  56.   }
  57.  
  58.  
  59.   fclose(pf);
  60. }
  61.  
  62.  

Para inicializar el fichero y probar el programa ejecuta el sigte código:
Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. typedef struct
  6. {
  7.   char nombre[100];
  8.   int telefono;
  9. }datos;
  10.  
  11. void main()
  12. {
  13.   FILE *pf;
  14.   datos ficha;
  15.   int i;
  16.  
  17.   pf=fopen("c:\\archivo.txt","w");
  18.  
  19.   strcpy(ficha.nombre,"Jose");
  20.   for(i=0;i<20;i++)
  21.   {
  22.     ficha.telefono=i;
  23.     fwrite(&ficha,sizeof(ficha),1,pf);
  24.   }
  25.   fclose (pf);
  26. }
  27.  
  28.  
Simplemente escribe 20 registros con el nombre de Jose y con un telefono que va de 0 a 19.
En fin con esto ya puedes hacer casi cualquier cosa con ficheros... Creo. :smartass:
Un sludo.  :comp:
No hay tonto más molesto que el ingenioso.