[C con Clase] Una pequeña duda con los ficheros

Salvador Pozo salvador en conclase.net
Mie Abr 25 18:12:54 CEST 2012


El pasado 2012-04-25 15:55:45, Marcos escribió:
 
M> Otra pregunta, es posible hacer esta funcion para varias estructuras, no
M> solo stIndice? Esque no se me ocurre nada "razonable"

void Intercambia(FILE *fi, long iz, long de)
{
   stIndice reg1, reg2;

   fseek(fi, iz*sizeof(stIndice), SEEK_SET);
   fread(&reg1, sizeof(stIndice), 1, fi);
   fseek(fi, de*sizeof(stIndice), SEEK_SET);
   fread(&reg2, sizeof(stIndice), 1, fi);
   fseek(fi, iz*sizeof(stIndice), SEEK_SET);
   fwrite(&reg2, sizeof(stIndice), 1, fi);
   fseek(fi, de*sizeof(stIndice), SEEK_SET);
   fwrite(&reg1, sizeof(stIndice), 1, fi);
}

Se puede generalizar más la función, añadiendo otro parámetro que indique el tamaño del registro. Por ejemplo:

----8<------
void Intercambia(FILE *fi, long iz, long de, long bytesporregistro)
{
   void *reg1;
   void *reg2;

   reg1 = malloc(bytesporregistro);
   reg2 = malloc(bytesporregistro);

   fseek(fi, iz*bytesporregistro, SEEK_SET);
   fread(&reg1, bytesporregistro, 1, fi);
   fseek(fi, de*bytesporregistro, SEEK_SET);
   fread(&reg2, bytesporregistro, 1, fi);
   fseek(fi, iz*bytesporregistro, SEEK_SET);
   fwrite(&reg2, bytesporregistro, 1, fi);
   fseek(fi, de*bytesporregistro, SEEK_SET);
   fwrite(&reg1, bytesporregistro, 1, fi);

   free(reg1);
   free(reg2);
}
----8<------

La llamada a esta función sería algo así:

Intercambia(fichero, a, b, sizeof(stIndice));

Una sugerencia: si vas a cortar y pegar desde una página web, para evitar que salgan "cosas raras", usa un formato de texto plano para los mensajes. De este modo no se copian las hojas de estilo ni los enlaces. Además de que se verá mejor el mensaje, se aligera mucho el tamaño.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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