Demo 4, tehtävä 4 ----------------- Kirjoita funktio psave, joka tallettaa kokonaislukutaulukon tiedostoon pakattuna siten, että jokaisesta luvusta talletetaan vain pyydetty määrä bittejä, ja prestore, joka palauttaa siten pakattuna talletetun taulukon, prototyypit: int psave(int a[], int nelems, int bits, char *filename); int prestore(int a[], int maxnelems, int bits, char *filename); Esim. 100 lukua, 4 bittiä per luku tuottaisi 50-tavuisen tiedoston, tai 11 lukua, 3 bittiä per tiedosto 5-tavuisen (33 bittiä vaatii 5 tavua, 7 bittiä jää yli). Alla pääohjelma, jolla näitä käyttäen voisi pakata tekstitiedostona talletetun esim. (enintään) sadan 5:n bitin kokonaisluvun listan tyyliin ./bitpacker w 100 5 4bitnums.dat < nums.txt ja lukea sen taas näin: ./bitpacker r 100 5 4bitnums.dat > nums.txt /* bitpacker.c * pakkaa tai purkaa kokonaislukutaulukon tiedostoon * tallettaen vain halutun määrän bittejä per luku. * * tallennus: bitpacker w lukum bitit tiedostonimi tiedosto * */ #include #include #include /* varsinaisen työn tekevät funktiot ovat eri tiedostossa: */ int psave(int a[], int nelems, int bits, char *filename); int prestore(int a[], int maxnelems, int bits, char *filename); int main(int argc, char *argv[]) { int *a; int nums, bits, count=0, i; if (argc!=5 || !strchr("rw",*argv[1]) || !sscanf(argv[2],"%d",&nums) || !sscanf(argv[3],"%d",&bits)) { fprintf(stderr,"usage: %s r|w bits file\n", argv[0]); exit(EXIT_FAILURE); } if (!(a = malloc(nums * sizeof(int)))) { fprintf(stderr,"Out of memory\n"); exit(EXIT_FAILURE); } switch(*argv[1]) { case 'w': while (count