Laboratorium 13: Praca nad zadaniem zaliczeniowym 4. Pliki

Ćwiczenie 1

Dany jest program przekształcający plik binarny na tekstowy i na odwrót.

program bttb;
 
var ile : Integer;
    kod : Word;
 
procedure komunikat;
begin
    writeln('Program przeksztalcajacy binaria na tekst i tekst na binaria');
    writeln('Sposob wywolania:');
    writeln('  bttb -bt PlikDanychBinarnych PlikWynikuTekstowego IleWWierszu');
    writeln('lub:');
    writeln('  bttb -tb PlikDanychTekstowych PlikWynikuBinarnego');
    halt
end;
 
procedure binariaNaTekst(s1, s2 : String; ile : Integer);
var f : file of Byte;
    g : Text;
    b : Byte;
    wAktualnym, i : Integer;
begin
    assign(f, s1);
    assign(g, s2);
    reset(f);
    rewrite(g);
    wAktualnym := 0;
    while not eof(f) do begin
        read(f, b);
        for i := 1 to 8 do begin
            write(g, b div 128);
            b := 2 * (b mod 128)
        end;
        wAktualnym := wAktualnym + 1;
        if wAktualnym = ile then begin
            writeln(g);
            wAktualnym := 0
        end else
            write(g, ' ')
    end;
    if wAktualnym > 0 then
        writeln(g);
    close(g);
    close(f)
end;
 
procedure tekstNaBinaria(s1, s2 : String);
var f : Text;
    g : file of Byte;
    byloBitow : Integer;
    aktualnyBajt : Byte;
    c : Char;
begin
    assign(f, s1);
    assign(g, s2);
    reset(f);
    rewrite(g);
    byloBitow := 0;
    aktualnyBajt := 0;
    while not eof(f) do
        if eoln(f) then
            readln(f)
        else begin
            read(f, c);
            if (c = '0') or (c = '1') then begin
                aktualnyBajt := 2 * aktualnyBajt;
                if c = '1' then
                    aktualnyBajt := aktualnyBajt + 1;
                byloBitow := byloBitow + 1;
                if byloBitow = 8 then begin
                    write(g, aktualnyBajt);
                    aktualnyBajt := 0;
                    byloBitow := 0
                end
            end
        end;
    if byloBitow <> 0 then
        writeln('Niepoprawny plik danych');
    close(g);
    close(f)
end;
 
begin
    if paramCount = 0 then
        komunikat;
    if paramStr(1) = '-bt' then begin
        if paramCount <> 4 then
            komunikat;
        ile := 1;
        val(paramStr(4), ile, kod);
        if (kod <> 0) or (ile <= 0) then
            komunikat;
        binariaNaTekst(paramStr(2), paramStr(3), ile)
    end else if paramStr(1) = '-tb' then begin
        if paramCount <> 3 then
            komunikat;
        tekstNaBinaria(paramStr(2), paramStr(3))
    end else
        komunikat
end.

  1. Uruchom go i przetestuj.
  2. Zmodyfikuj program, dodając nowe opcje zmieniające obsługiwany format pliku tekstowego. Można np. rozszerzyć go o obsługę wartości bajtów w zapisie dziesiętnym lub szesnastkowym.

Ćwiczenie 2

Napisz program kompresujący i program dekompresujący plik binarny metodą RLE (run-lenght encoding, kodowanie długości serii).