110 lines
2.2 KiB
C
110 lines
2.2 KiB
C
#include <stdio.h>
|
|
|
|
int comprimi(FILE *fin, FILE *fout) {
|
|
char lastChar = 0, currChar; // sono sicuro che il file non inizi con un null character
|
|
int count = 0;
|
|
|
|
int charCount = 0;
|
|
|
|
while (!feof(fin))
|
|
{
|
|
currChar = fgetc(fin);
|
|
|
|
if (feof(fin))
|
|
break;
|
|
|
|
|
|
if (currChar != lastChar || count == 10) {
|
|
if (count > 1) {
|
|
fputc('$', fout);
|
|
fputc('0'+count-1, fout);
|
|
charCount += 2;
|
|
}
|
|
|
|
count = 1;
|
|
lastChar = currChar;
|
|
fputc(currChar, fout);
|
|
charCount++;
|
|
} else {
|
|
count++;
|
|
}
|
|
}
|
|
|
|
if (count > 1) { // Controllo se devo scrivere le ripetizioni dell'ultimo carattere
|
|
fputc('$', fout);
|
|
fputc('0'+count-1, fout);
|
|
charCount += 2;
|
|
}
|
|
|
|
return charCount;
|
|
}
|
|
|
|
int decomprimi(FILE *fin, FILE *fout) {
|
|
char lastChar, currChar;
|
|
int count, i;
|
|
|
|
int charCount = 0;
|
|
while (!feof(fin))
|
|
{
|
|
currChar = fgetc(fin);
|
|
|
|
if (feof(fin))
|
|
break;
|
|
|
|
if (currChar == '$') {
|
|
count = fgetc(fin) - '0';
|
|
|
|
for (i = 0; i < count; i++)
|
|
fputc(lastChar, fout);
|
|
|
|
charCount += count;
|
|
} else {
|
|
lastChar = currChar;
|
|
fputc(currChar, fout);
|
|
charCount++;
|
|
}
|
|
}
|
|
|
|
return charCount;
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
|
|
FILE *fp_read, *fp_write;
|
|
char operation;
|
|
|
|
puts("Inserisci 'c' per comprimere o qualsiasi altro carattere per decomprimere: ");
|
|
scanf(" %c", &operation);
|
|
|
|
if (operation == 'c') {
|
|
fp_read = fopen("./sorgente.txt", "r");
|
|
fp_write = fopen("./compresso.txt", "w");
|
|
} else {
|
|
fp_read = fopen("./compresso.txt", "r");
|
|
fp_write = fopen("./decompresso.txt", "w");
|
|
}
|
|
|
|
if (fp_read == NULL)
|
|
{
|
|
printf("Error opening input file\n");
|
|
return 1;
|
|
}
|
|
if (fp_write == NULL)
|
|
{
|
|
printf("Error opening output file\n");
|
|
return 2;
|
|
}
|
|
|
|
if (operation == 'c') {
|
|
comprimi(fp_read, fp_write);
|
|
} else {
|
|
decomprimi(fp_read, fp_write);
|
|
}
|
|
|
|
fclose(fp_read);
|
|
fclose(fp_write);
|
|
|
|
return 0;
|
|
} |