25.Prednaska/Ulohy

Z Pascal
Prejsť na: navigácia, hľadanie

25. Riešené úlohy


< 25.Prednáška


Súbor čísel

1. vynulovať podpriemerné prvky v binárnom súbore

V binárnom súbore s reálnymi číslami treba zistiť priemer všetkých čísel a potom všetky hodnoty, ktoré sú menšie ako tento priemer, treba vynulovať.

var
  F: TFileStream;
  R, Sucet, Priemer: Real;
begin
  F := TFileStream.Create('cisla.dat', fmOperReadWrite);
  if F.Size > 0 then
  begin
    Sucet := 0;
    while F.Position < F.Size do
    begin
      F.ReadBuffer(R, SizeOf(Real));
      Sucet := Sucet + R;
    end;
    Priemer := Sucet / (F.Size / SizeOf(Real));
    F.Position := 0;
    while F.Position < F.Size do
    begin
      F.ReadBuffer(R, SizeOf(Real));
      if R < Priemer then
      begin
        F.Position := F.Position - SizeOf(Real);
        R := 0;
        F.WriteBuffer(R, SizeOf(Real));
      end;
    end;
  end;
  F.Free;
  ReadLn;
end.


2. Vyhodiť jednu hodnotu z binárneho súboru

Binárny súbor obsahuje celé čísla. Program z neho vyhodí hodnotu na zadanej pozícii.

Vyhadzovať bude tak, že všetky hodnoty za touto pozíciou v súbore po jednom posunie a potom súbor skráti.

Toto je dosť neefektívne riešenie.

var
  F: TFileStream;
  Index, X: Integer;
begin
  F := TFileStream.Create('cisla.dat', fmOperReadWrite);
  Write('? ');
  ReadLn(Index);
  if (Index >= 0) and (Index < F.Size div SizeOf(Integer)) then
  begin
    F.Position := (Index + 1) * SizeOf(Integer);
    while F.Position < F.Size do
    begin
      F.ReadBuffer(X, SizeOf(Integer));
      F.Position := F.Position - 2 * SizeOf(Integer);
      F.WriteBuffer(X, SizeOf(Integer));
      F.Position := F.Position + SizeOf(Integer);
    end;
    F.Size := F.Size - SizeOf(Integer);
  end;
  F.Free;
  ReadLn;
end.


3. Vyhodiť jednu hodnotu z binárneho súboru pomocou pomocného buffra

Binárny súbor obsahuje celé čísla. Program z neho vyhodí hodnotu na zadanej pozícii.

Vyhadzovať bude tak, že všetky najprv naraz prečíta celú časť súboru za vyhadzovanou hodnotou do pomocného buffra a potom ju naraz zapíše späť do súboru.

var
  F: TFileStream;
  Index, X, Dlzka: Integer;
  Buffer: Pointer;
begin
  F := TFileStream.Create('cisla.dat', fmOperReadWrite);
  Write('? ');
  ReadLn(Index);
  Index := Index * SizeOf(Integer);
  if (Index >= 0) and (Index < F.Size) then
  begin
    F.Position := Index + SizeOf(Integer);
    Dlzka := F.Size - F.Position;
    if Dlzka > 0 then
    begin
      GetMem(Buffer, Dlzka);
      F.ReadBuffer(Buffer^, Dlzka);
      F.Position := Index;
      F.WriteBuffer(Buffer^, Dlzka);
      FreeMem(Buffer);
    end;
    F.Size := F.Size - SizeOf(Integer);
  end;
  F.Free;
  ReadLn;
end.


4. Otočiť poradie čísel v súbore pomocou pomocného poľa

Najprv prečítať obsah do dynamického poľa čísel, obsah poľa otočiť a na koniec pole zapísať do súboru.

var
  F: TFileStream;
  I, X: Integer;
  Pole: array of Integer;
begin
  F := TFileStream.Create('cisla.dat', fmOperReadWrite);
  if F.Size > 0 then
  begin
    SetLength(Pole, F.Size div SizeOf(Integer));
    F.ReadBuffer(Pole[0], F.Size);
    for I := 0 to (High(Pole) - 1) div 2 do
    begin
      X := Pole[I];
      Pole[I] := Pole[High(Pole) - I];
      Pole[High(Pole) - I] := X;
    end;
    F.Position := 0;
    F.WriteBuffer(Pole[0], F.Size);
  end;
  F.Free;
  ReadLn;
end.


Súbor reťazcov

5. zapísať TextFile do súboru reťazcov

Čítať riadky textového súboru a zapisovať ich ako reťazce do binárneho súboru (dĺžka + reťazec).

Môžete využiť metódu WriteAnsiString.

var
  T: TextFile;
  F: TFileStream;
  S: string;
begin
  AssignFile(T, 'text.txt');
  Reset(T);
  F := TFileStream.Create('text.dat', fmCreate);
  while not Eof(T) do
  begin
    ReadLn(T, S);
    F.WriteAnsiString(S);
  end;
  F.Free;
  CloseFile(T);
  ReadLn;
end.


6. Zistiť počet reťazcov v súbore reťazcov

Binárny súbor obsahuje postupnosť znakových reťazcov (dĺžka + reťazec), napr. zapísané pomocou metódy WriteAnsiString. Program zistí počet týchto reťazcov.

Nečítajte reťazce ale iba ich 4-bajtové dĺžky.

var
  F: TFileStream;
  Pocet, Dlzka: Integer;
begin
  F := TFileStream.Create('text.dat', fmOpenRead);
  Pocet := 0;
  while F.Position < F.Size do
  begin
    Dlzka := F.ReadDWord;
    F.Position := F.Position + Dlzka;
    Inc(Pocet);
  end;
  F.Free;
  WriteLn('pocet retazcov = ', Pocet);
  ReadLn;
end.


7. Skrátiť reťazce (Trim) v súbore reťazcov

Binárny súbor obsahuje postupnosť znakových reťazcov (dĺžka + reťazec), napr. zapísané pomocou metódy WriteAnsiString. Program vyhodí medzery zo začiatku a na konci všetkých reťazcov (použite Trim z unitu SysUtils). Súbor sa týmto môže skrátiť.

var
  F: TFileStream;
  Odkial, Kam: Integer;
  S: string;
begin
  F := TFileStream.Create('text.dat', fmOpenReadWrite);
  Kam := 0;
  while F.Position < F.Size do
  begin
    S := F.ReadAnsiString;
    Odkial := F.Position;
    F.Position := Kam;
    F.WriteAnsiString(Trim(S));
    Kam := F.Position;
    F.Position := Odkial;
  end;
  F.Size := Kam;
  F.Free;
  ReadLn;
end.