Gå til innhold

[Løst]C - en byte for mye i komprimert fil, hva er feil?


Anbefalte innlegg

Hei. Jeg holder på med en oppgave der vi skal komprimere en tekstfil og lagre den for deretter å lese og dekomprimere den. Problemet jeg har er at komprimeringa mi alltid legger til en ekstra byte!? :hmm:

Hvorfor i huleste skjer det?

 

Jeg er ganske sikker på at dekomprimerings-metoden min funker som den skal, ettersom når jeg kjører den på en ferdigkomprimert fil som ligger ute på fagets hjemmesider så skriver den ut som den skal. Men når jeg skriver ut en av de komprimerte filene som programmet har laget, så skriver det ut en byte for mye... Jeg skjønner ingenting, for jeg har sett på koden til en jeg går med, den har ikke det problemet og det er samme kode.

 

Legger ut hele obligen;

 

 

#include 

#include 

#include 



int decoceFile(char *filename);

int encodeFile(char *filename, char *ofile);

int printContent(char *filename);



int main(int argc, char **argv) {

if(argc != 4 && argc != 3) {

printf("ERROR\n");

return 1;

}



if(strcmp(argv[1], "p") == 0 && argc == 3) {

//Print

printContent(argv[2]);

} else if(strcmp(argv[1], "d") == 0 && argc == 3) {

//Decode

decodeFile(argv[2]);

} else if(strcmp(argv[1], "e") == 0) {

//Encode

encodeFile(argv[2], argv[3]);

} else {

printf("ERROR\n");

}



return 0;

}



int printContent(char *filename) {

FILE *file = fopen(filename, "r");



if(file == NULL) {

printf("Couldn't find file.\n");

return 1;

}



int c; 

while((c = fgetc(file)) != EOF) {

if(c == ' ') {

c = '|';

}

printf("%c", c);

}



printf("\n");

fclose(file);



return 0;

}



int fromBinary(int i) {

if(i == 0) {

return ' ';

} else if(i == 1) {

return ':';

} else if(i == 2) {

return '@';

} else if(i == 3) {

return '\n';

} else {

return '';

}

}



int shiftIt(int i, int c) {

if(i == 0) {

return c >> 6;

} else {

return (c >> (6 - i))^((c >> (8 - i)) << 2);

}

}



int decodeFile(char *filename) {

FILE *file = fopen(filename, "r");



//TODO

fseek(file, 0, SEEK_END);

long fileLength = ftell(file);

long numChar = fileLength*4;

fseek(file, 0, SEEK_SET);



long count = 0;

printf("FileLength: %d byte\n", fileLength);



int c = 0;

while((c = fgetc(file)) != EOF) {

int d = 0;

int i = 0;

for(i = 0; i < 7; i += 2) {

d = shiftIt(i, c);



d = fromBinary(d);



printf("%c", d);

}

} 



fclose(file);

}



int toBinary(int c) {

if(c == ' ') {

return 0;

} else if(c ==':') {

return 1;

} else if(c == '@') {

return 2;

} else if(c == '\n') {

return 3;

} else {

return c;

}

}



int encodeFile(char *filename, char *ofile) {

FILE *inFile = fopen(filename, "r");

FILE *outFile = fopen(ofile, "w");



int c = 0;

while(c != EOF && !feof(inFile)){

int write = 0;

int i = 0;



for(i = 0; i < 7; i += 2) {

c = fgetc(inFile);

c = toBinary©;



if(c == EOF || feof(inFile)) break;

write = write | (c << (6 - i));

}



//if(!feof(inFile) || c != EOF) {

fwrite(&write, 1, 1, outFile);

//}

}



fclose(inFile);

fclose(outFile);

}

 

 

 

Oppgava ligger på INF1060 sidene til UIO og tekstfilene ligger her.

Det er oppgave 2 det dreier seg om.

 

På forhånd takk for alle svar :)

 

-Håkon

Lenke til kommentar
Videoannonse
Annonse

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...