Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Escribir un programa ISO C que, sin crear archivos intermedios, altere el
- archivo “data.bin” reemplazando todas las secuencias de 3 bytes
- 0x34 0x43 0x44 por la secuencia de 2 bytes 0x34 0x43.
- Cabe destacar que el programa debe reprocesar el reemplazo efectuado.
- (Ejemplo: 0x34 0x43 0x44 0x44 ---> 0x34 0x43 0x44 ---> 0x34 0x43).
- */
- /*
- Análisis: el archivo va a reducir su tamaño. Vamos a tener dos seeks, uno de
- lectura y uno de escritura. Voy a hacer una máquina de estados, con los estados
- NORMAL, e34, e43.
- */
- #include <stdio.h>
- #include <unistd.h>
- enum estados {NORMAL, E34, E43};
- char leer_byte(FILE* f, int* seek_lectura) {
- fseek(f, *seek_lectura, SEEK_SET);
- char c = fgetc(f);
- *seek_lectura = ftell(f);
- return c;
- }
- void escribir_byte(FILE* f, int* seek_escritura, char c) {
- fseek(f, *seek_escritura, SEEK_SET);
- fputc(c, f);
- *seek_escritura = ftell(f);
- }
- int main() {
- int seek_lectura = 0;
- int seek_escritura = 0;
- enum estados estado_actual = NORMAL;
- FILE* f = fopen("data.bin", "r+");
- if (!f) return -1;
- char c;
- while ( (c = leer_byte(f, &seek_lectura)) != EOF ) {
- if (estado_actual == NORMAL) {
- escribir_byte(f, &seek_escritura, c);
- if (c == 0x34) {
- estado_actual = E34;
- }
- } else if (estado_actual == E34) {
- escribir_byte(f, &seek_escritura, c);
- if (c == 0x43) {
- estado_actual = E43;
- } else if (c == 0x34) {
- estado_actual = E34;
- } else {
- estado_actual = NORMAL;
- }
- } else if (estado_actual == E43) {
- if (c != 0x44) {
- escribir_byte(f, &seek_escritura, c);
- }
- if (c == 0x44) {
- estado_actual = E43; // Sigue el mismo estado
- } else if (c == 0x34) {
- estado_actual = E34;
- } else {
- estado_actual = NORMAL;
- }
- }
- }
- fclose(f);
- truncate("data.bin", seek_escritura);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement