#include #include #include #define BS 128 /* Program slouci soubory do jednoho, nebo je zpetne z nej vyextrahuje. * * - Program neni osetren pro pripady chyb, ktere mohou nastat. * - Program je omezen na soubory, ktere v svem jmene neobsahuji * mezery nebo jine bile znaky a jejichz delka je kratsi nez 256 znaku. * - Program kopiruje data s vyuzitim bufferu, ale kombinuje s formatovanym * vstupem a vystypem. * - Cast formatovaciho retezce: %*c rika, ze mame precist znak, ale nikam ho neukladame. * * Priklad spusteni pro sbaleni: * * ./pack -s vse.pack 01.pdf 02.pdf 03.pdf * * Priklad spusteni pro rozbaleni: * * ./pack -r vse.pack */ int main(int argc, char**argv) { if (argc < 3) { // osetreni spatneho spusteni bez parametru fprintf(stderr, "Chyba!... navodek na pouziti!\n"); return 1; } char buf[BS]; if (!strcmp(argv[1], "-s")) { // sbal FILE *fout = fopen(argv[2], "wb"); for (int i = 3; i < argc; ++i) { printf("pridavame... %s\n", argv[i]); FILE *fin = fopen(argv[i], "rb"); fseek(fin, 0, SEEK_END); fprintf(fout, "%s %ld ", argv[i], ftell(fin)); rewind(fin); size_t precteno; do { precteno = fread(buf, 1, BS, fin); fwrite(buf, 1, precteno, fout); } while (precteno == BS); fclose(fin); } fclose(fout); } else if (!strcmp(argv[1], "-r")) { // rozbal FILE *fin = fopen(argv[2], "rb"); char fnazev[257]; long int fdelka; while (2 == fscanf(fin, "%256s %ld%*c", fnazev, &fdelka) && strlen(fnazev) > 0) { FILE *fout = fopen(fnazev, "wb"); size_t precteno; do { precteno = fread(buf, 1, fdelka > BS ? BS : fdelka, fin); fwrite(buf, 1, precteno, fout); fdelka -= BS; } while (fdelka > 0); fclose(fout); } fclose(fin); } else { fprintf(stderr, "Chybny prepinac: %s\n", argv[1]); return 2; } return 0; }