hjahre Skrevet 17. september 2009 Del Skrevet 17. september 2009 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!? 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
hjahre Skrevet 18. september 2009 Forfatter Del Skrevet 18. september 2009 Fant det ut! Var en feil i fila jeg skulle komprimere som gjorde det Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå