Zamiana małych liter na duże (i odwrotnie) w pliku

0

Witam. Napisałem program, która ma zamieniać małe litery na duże i duże na małe z danego pliku. Wynik ma zostać zapisany do nowego pliku. Moglibyście sprawdzić ten kod, bo kompilować się kompiluje, ale zaraz wyskakuje błąd. Wiem, że brakuje mi jeszcze linijki z kodem do zapisania zmiany do nowego pliku i tu też proszę o pomoc ;)

//---------------------------------------------------------------------------
program dsa;

uses crt;

var
  plik,plik2 : text;
  s:string[100];
  i:integer;

  begin


    assignfile(plik,'plik.txt');
    rewrite(plik);
    assignfile(plik2,'plik2.txt');
    rewrite(plik2);

    readln(s);

    writeln(plik,s);

    while not Eof(plik) do begin

    while not Eoln(plik) do begin


    for i:=0 to length(s) do  begin

    if (ord(s[i])>96) and (ord(s[i])<123)
    then s[i]:=chr(ord(s[i])-32)                       //male na duze

    else if (ord(s[i])>64) and (ord(s[i])<91)
    then s[i]:=chr(ord(s[i])+32);                     //duze na male

    end;
    end;
    end;

    closefile(plik);
    closefile(plik2);

    readln();

    end.

//---------------------------------------------------------------------------

zamiana znacznika <code class="c"> na <code class="delphi"> - @furious programming

1

Moglibyście sprawdzić ten kod, bo kompilować się kompiluje, ale zaraz wyskakuje błąd.

Podaj treść błędu łaskawy Panie...

s:string[100];

Kolejny zły nawyk ze starego Pascala... Używaj po prostu typu String, bo nigdy nie wiadomo jaką długość będzie miała pobrana z pliku linijka tekstu; I w ogóle same problemy przez to są, więc nie ma co kombinować, oszczędzać pamięci (tylko pozornie) itd.;

Po pierwsze - korzystaj z bloków Try Finally - zabezpieczysz się przed wyciekami pamięci:

var
  tfInput, tfOutput: TextFile;
begin
  AssignFile(tfInput, 'C:\Input.txt');
  AssignFile(tfOutput, 'C:\Output.txt');
  Reset(tfInput);
  ReWrite(tfOutput);
  try

  finally
    CloseFile(tfInput);
    CloseFile(tfOutput);
  end;
end.

Po drugie - wystarczy jedna pętla While z jednym warunkiem Eof:

var
  tfInput, tfOutput: TextFile;
begin
  AssignFile(tfInput, 'C:\Input.txt');
  AssignFile(tfOutput, 'C:\Output.txt');
  Reset(tfInput);
  ReWrite(tfOutput);
  try
    while not EoF(tfInput) do
    begin

    end;
  finally
    CloseFile(tfInput);
    CloseFile(tfOutput);
  end;
end.

Teraz wystarczy pobrać całą linię z pliku źródłowego, zamienienie znaków i zapisanie jej do pliku docelowego; Przy czym zamianę wielkości znaków możesz oprzeć o porównania ze zbiorem (unikniesz dwóch warunków), a do samej zamiany procedur Inc i Dec:

var
  tfInput, tfOutput: TextFile;
  strLine: AnsiString;
  intToken: Integer;
begin
  AssignFile(tfInput, 'Input.txt');
  AssignFile(tfOutput, 'Output.txt');
  Reset(tfInput);
  ReWrite(tfOutput);
  try
    while not EoF(tfInput) do
    begin
      ReadLn(tfInput, strLine);

      for intToken := 1 to Length(strLine) do
        if strLine[intToken] in [#65 .. #90] then
          Inc(strLine[intToken], 32)
        else
          if strLine[intToken] in [#97 .. #122] then
            Dec(strLine[intToken], 32);

      WriteLn(tfOutput, strLine);
    end;
  finally
    CloseFile(tfInput);
    CloseFile(tfOutput);
  end;
end.

Ewentualnie możesz jeszcze skorzystać z instrukcji wyboru Case Of, przy sprawdzaniu kodu znaku:

var
  tfInput, tfOutput: TextFile;
  strLine: AnsiString;
  intToken: Integer;
begin
  AssignFile(tfInput, 'Input.txt');
  AssignFile(tfOutput, 'Output.txt');
  Reset(tfInput);
  ReWrite(tfOutput);
  try
    while not EoF(tfInput) do
    begin
      ReadLn(tfInput, strLine);

      for intToken := 1 to Length(strLine) do
        case strLine[intToken] of
          #65 .. #90:  Inc(strLine[intToken], 32);
          #97 .. #122: Dec(strLine[intToken], 32);
        end;

      WriteLn(tfOutput, strLine);
    end;
  finally
    CloseFile(tfInput);
    CloseFile(tfOutput);
  end;
end.

I to by było na tyle; Pamiętaj, aby kod był zawsze ładnie sformatowany, wcięcia i puste linie zawsze wstawione sensownie, a także aby zmienne/stałe/typy itd. były nazwa także sensownie; No i używaj namiętnie Shiftu, bo "PascalCase" należy zachować; Co do notacji węgierskiej to zdania są podzielone, ja jednak używam jej, bo kod jest bardziej czytelny i można wiele zmiennych nazwać tak samo, jedynie z innym prefiksem.

0

Dzięki wielkie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1