Nadesłany przez Tomasz Lubiński, 16 czerwca 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
rle.c:
// Kompresja RLE (Run Length Encoding) // www.algorytm.org // (c) 2007 by Tomasz Lubinski #include "stdio.h" /* kompresja RLE */ void compress(FILE *in, FILE *out) { char cur, prev, tmp; unsigned char cnt = 0; int cont; cont = fread(&cur, sizeof(char), 1, in); prev = cur + 1; while (cont == 1) { if (prev != cur) { if (cnt == 0) { /* znaki obok siebie rozne wrzuc do pliku wyjsciowego */ fwrite(&cur, sizeof(char), 1, out); } else { /* skonczyla sie sekwencja powtarzajcych sie znakow */ cnt--; fwrite(&prev, sizeof(char), 1, out); fwrite(&cnt, sizeof(char), 1, out); fwrite(&cur, sizeof(char), 1, out); cnt = 0; } } else { /* liczbe powtarzajacych sie znakow zapisujemy na jednym bajcie wypisz sekwencje jezeli ma ona maksymalna dlugosc */ if (cnt == 255) { fwrite(&prev, sizeof(char), 1, out); fwrite(&cnt, sizeof(char), 1, out); cnt = 0; cont = fread(&cur, sizeof(char), 1, in); prev = cur + 1; continue; } else { /* licz powtarzajace sie znaki */ cnt++; } } /* odczytaj kolejny znak z pliku wejsciowego */ cont = fread(&tmp, sizeof(char), 1, in); if (cont == 1) { prev = cur; cur = tmp; } } /* jezeli plik konczy sie sekwencja wypisz ja */ if (prev == cur) { cnt--; fwrite(&prev, sizeof(char), 1, out); fwrite(&cnt, sizeof(char), 1, out); } } /* dekompresja RLE */ void decompress(FILE *in, FILE *out) { char cur, prev; unsigned char cnt = 0; int cont, i; cont = fread(&cur, sizeof(char), 1, in); prev = cur + 1; while (cont == 1) { if (prev != cur) { /* znaki obok siebie rozne wrzuc do pliku wyjsciowego */ fwrite(&cur, sizeof(char), 1, out); prev = cur; /* odczytaj kolejny znak */ cont = fread(&cur, sizeof(char), 1, in); } else { /* znaki obok siebie sa rowne - mamy sekwencje */ /* odczytaj dlugosc sekwencji i wrzuc ja do pliku wyjsciowego */ cont = fread(&cnt, sizeof(char), 1, in); for (i=0; i<=cnt; i++) { fwrite(&cur, sizeof(char), 1, out); } /* odczytaj kolejny znak */ cont = fread(&cur, sizeof(char), 1, in); prev = cur + 1; } } } /* pobierz dane od uzytkownika */ int main() { int x; char inPath[1000]; char outPath[1000]; FILE *in, *out; printf("1 - kompresja\n"); printf("2 - dekompresja\n"); scanf("%d", &x); printf("Plik wejsciowy:\n"); scanf("%s", inPath); printf("Plik wyjsciowy:\n"); scanf("%s", outPath); in = fopen(inPath, "rb"); out = fopen(outPath, "wb"); if (in == NULL){ printf("Nie moge otworzyc pliku wejsciowego\n"); return -1; } if (out == NULL){ printf("Nie moge utworzyc pliku wyjsciowego\n"); return -1; } if (x == 1) compress(in, out); else decompress(in, out); fclose(in); fclose(out); return 0; }