Advertisement
tomasaccini

Untitled

Jul 17th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.79 KB | None | 0 0
  1. /*
  2.  Escribir un programa C que, sin crear archivos intermedios, procese el archivo
  3.  “enteros.dat”. El procesamiento consiste en leer grupos de 2 enteros sin
  4.  signo de 32 bits desde el archivo y escribir, en su lugar, la resta del
  5.  grupo (es decir que el archivo se acortará).
  6. */
  7.  
  8. /*
  9. Pasos a seguir:
  10.     1. Leer de a 4 bytes, armar un uint32_t.
  11.     2. Leer dos bloques de 4 bytes.
  12.     3. Restar esos dos bloques.
  13.     4. Escribir el resultado.
  14.     5. Notar que el seek de lectura avanzó 8 bytes y el de escritura 4.
  15.     6. Repetir.
  16.     7. Truncar archivo.
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. #include <stdint.h>
  24. #include <stdbool.h>
  25.  
  26. int leer_numero(FILE* f, int* seek_lectura, uint32_t* valor) {
  27.     fseek(f, *seek_lectura, SEEK_SET);
  28.     char aux[4];
  29.     int return_value;
  30.     return_value = fread(aux, 4, 1, f);
  31.     if (return_value == 0) return return_value;
  32.     memcpy(valor, aux, 4);
  33.     *seek_lectura = ftell(f);
  34.     return return_value;
  35. }
  36.  
  37. void escribir_numero(FILE* f, int* seek_escritura, uint32_t valor) {
  38.     fseek(f, *seek_escritura, SEEK_SET);
  39.     fwrite(&valor, 4, 1, f);
  40.     *seek_escritura = ftell(f);
  41. }
  42.  
  43. int main() {
  44.     FILE* f = fopen("enteros.dat", "r+");
  45.     if (!f) return -1;
  46.     int seek_lectura = 0;
  47.     int seek_escritura = 0;
  48.     uint32_t A;
  49.     uint32_t B;
  50.     int return_value;
  51.  
  52.     while (true) {
  53.         return_value = leer_numero(f, &seek_lectura, &A);
  54.         if (return_value == 0) break;
  55.         return_value = leer_numero(f, &seek_lectura, &B);
  56.         if (return_value == 0) break;
  57.         escribir_numero(f, &seek_escritura, A-B);
  58.         printf("DEBUG: A: %u, B: %u, A-B: %u\n", A, B, A-B);
  59.     }
  60.  
  61.     fclose(f);
  62.     truncate("enteros.dat", seek_escritura);
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement