Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Escribir un programa C que, sin crear archivos intermedios, procese el archivo
- “enteros.dat”. El procesamiento consiste en leer grupos de 2 enteros sin
- signo de 32 bits desde el archivo y escribir, en su lugar, la resta del
- grupo (es decir que el archivo se acortará).
- */
- /*
- Pasos a seguir:
- 1. Leer de a 4 bytes, armar un uint32_t.
- 2. Leer dos bloques de 4 bytes.
- 3. Restar esos dos bloques.
- 4. Escribir el resultado.
- 5. Notar que el seek de lectura avanzó 8 bytes y el de escritura 4.
- 6. Repetir.
- 7. Truncar archivo.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <stdint.h>
- #include <stdbool.h>
- int leer_numero(FILE* f, int* seek_lectura, uint32_t* valor) {
- fseek(f, *seek_lectura, SEEK_SET);
- char aux[4];
- int return_value;
- return_value = fread(aux, 4, 1, f);
- if (return_value == 0) return return_value;
- memcpy(valor, aux, 4);
- *seek_lectura = ftell(f);
- return return_value;
- }
- void escribir_numero(FILE* f, int* seek_escritura, uint32_t valor) {
- fseek(f, *seek_escritura, SEEK_SET);
- fwrite(&valor, 4, 1, f);
- *seek_escritura = ftell(f);
- }
- int main() {
- FILE* f = fopen("enteros.dat", "r+");
- if (!f) return -1;
- int seek_lectura = 0;
- int seek_escritura = 0;
- uint32_t A;
- uint32_t B;
- int return_value;
- while (true) {
- return_value = leer_numero(f, &seek_lectura, &A);
- if (return_value == 0) break;
- return_value = leer_numero(f, &seek_lectura, &B);
- if (return_value == 0) break;
- escribir_numero(f, &seek_escritura, A-B);
- printf("DEBUG: A: %u, B: %u, A-B: %u\n", A, B, A-B);
- }
- fclose(f);
- truncate("enteros.dat", seek_escritura);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement