Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/04/2015, 15:49
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Mostrar los últimos 5 registros de un archivo [C]

Se hace tal como lo tienes en la estructura. Tras mover el cursor al final del archivo haces: cRegistros = ftell( ptrFile ) / ( sizeof(char) + (sizeof(char)*30) + (sizeof(char)*30) );

Que también puede ser: cRegistros = ftell( ptrFile ) / ( sizeof(char) + sizeof(Traductor.ingles) + sizeof(Traductor.espaniol) );

Lo que debes evitar es tomar el tamaño de la estructura con el sizeof, ya que te tragas la alineación de bytes que te puede inflar la estructura dependiendo del compilador que uses y una serie de reglas no vienen al caso, pero nada te impide hacer la suma de cada dato por separado para obtener el tamaño real de la estructura. =)

un ejemplo es:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <windows.h>
  4.  
  5. struct Datos{
  6.     int edad;
  7.     char nombre[20];
  8.     double peso;
  9. };
  10.  
  11. void escribe_traductor ( FILE *fp, struct Datos *dato );
  12. void lee_traductor ( FILE *fp, struct Datos *dato );
  13.  
  14. int main () {
  15.     FILE *ptrFile;
  16.     ptrFile = fopen ( "archivo.txt", "w+" );
  17.     int i;
  18.     long cRegistros, l5u;
  19.    
  20.     if ( ptrFile == NULL ) {
  21.         printf ( "No ha sido crear abrir archivo.txt" );
  22.         return 1;
  23.     }
  24.    
  25.     //Creamos algunos datos para escribir en el fichero
  26.     struct Datos dato[5] = {
  27.         { 24, "Rafael", 82.25 },
  28.         { 0, "José", 76.07 },
  29.         { 969, "Matusalén", 75.70},
  30.         { 28, "Manola", 140 },
  31.         { 42, "Obama", 70 }
  32.     };
  33.    
  34.     escribe_traductor( ptrFile, &dato[2] ); // escribimos uno de los registros, el 3º registo lo escribiremos.
  35.  
  36.     //al escribir ya estamos al final del fichero, no hace falta fseek(ptrFile, 0, SEEK_END);
  37.     cRegistros = ftell( ptrFile ) / ( sizeof( int ) + ( sizeof( char ) * 20 ) + sizeof ( double ) );
  38.     printf("actualmente hay %ld registro/s en el archivo\n", cRegistros);
  39.    
  40.     //probamos poner más 2 registro a ver
  41.     escribe_traductor( ptrFile, &dato[0] );
  42.     escribe_traductor( ptrFile, &dato[3] );
  43.    
  44.     //aun estamos al final, no usamos fseek por que no hace falta ;)
  45.     cRegistros = ftell( ptrFile ) / ( sizeof( int ) + ( sizeof( char ) * 20 ) + sizeof ( double ) );
  46.     printf("actualmente hay %ld registro/s en el archivo\n", cRegistros);    
  47.    
  48.     fclose ( ptrFile );
  49.     getchar();
  50.     return  0;
  51. }
  52.  
  53. void escribe_traductor ( FILE *fp, struct Datos *dato ) {
  54.     fwrite ( &dato->edad, sizeof ( int ), 1, fp );
  55.     fwrite ( dato->nombre, sizeof ( char ), 20, fp );
  56.     fwrite ( &dato->peso, sizeof ( double ), 1, fp );
  57.    
  58. }
  59.  
  60. void lee_traductor ( FILE *fp, struct Datos *dato ) {
  61.     fread ( &dato->edad, sizeof ( int ), 1, fp );
  62.     fread ( dato->nombre, sizeof ( char ), 20, fp );
  63.     fread ( &dato->peso, sizeof ( double ), 1, fp );
  64. }