logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kod w Pascalu do porównania plików tekstowych z ignorowaniem wielkości liter

mf18 20 Sty 2006 13:24 2144 8
REKLAMA
  • #1 2199303
    mf18
    Poziom 12  
    Posty: 95
    Pomógł: 5
    Ocena: 17
    Witam,
    czy ktoś może napisać i zamieścić tu kod źródłowy programu, którego zadaniem jest porównanie dwóch plików tekstowych? Program ma wykorzystywac funkcje zamiany małych liter na duże i odwrotnie, tak, żeby porównywał pliki bez względu na wielkośc liter. Na końcu ma wyświetlić informację, czy podane pliki są takie same, czy nie.
  • REKLAMA
  • Pomocny post
    #2 2199801
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Pierwszy plik: ,'d:\plik.txt');
    drugi plik: 'd:\plik1.txt');
    uses crt;
    var odczyt1,odczyt:text;
    ch,ch1:char;
    begin
    clrscr;
    assign(odczyt,'d:\plik.txt');
    reset(odczyt);
    assign(odczyt1,'d:\plik1.txt');
    reset(odczyt1);
    while not eof(odczyt) do begin
    while not eof(odczyt1) do begin
    read(odczyt,ch); ch:=upcase(ch);
    read(odczyt1,ch1);ch1:=upcase(ch1);
    if(ch<>ch1) then begin
    writeln('pliki sa rozne');readkey;close(odczyt);close(odczyt1);exit;end;
    end; end;
    close(odczyt);close(odczyt1);
    writeln('pliki sa takie same');
    readkey;
    end.
  • REKLAMA
  • #3 2203730
    mf18
    Poziom 12  
    Posty: 95
    Pomógł: 5
    Ocena: 17
    Dziękuje uprzejmie ed-ek, program robi wszystko tak, jak byc powinno. Pozdrawiam.
  • REKLAMA
  • #4 2204054
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    ed-ek: twój kod jest bardzo nieczytelny, a ponad to zawiera poważny błąd -> jeśli pierwszy plik jest dłuższy od drugiego, i oba są postaci odpowiednio X+Y oraz X to program sie zawiesi.. zastosowanie while w while obie z warunkiem 'not eof' to katastrofajny sposób.. jeśli oba pliki bendą właśnie postaci X+Y i X to obie pętle spełnią swoje zadanie i pliki zostaną porównane.. ale ponieważ drugi plik sie skończy wewnętrzna pętla będzie pomijana (niespełnienie 'not eof(odczyt1)') a zewnętrzna będzie sie wykonywać w nieskończoność (brak możliwości przejścia do końca pierwszego pliku ponieważ niema odczytu znaku)..
    Poprawiony kod:
    
    uses crt; 
    var file1,file2: Text; 
        ch,ch1: Char; 
        IsSameFile: Boolean;
    begin 
      clrscr; 
      assign(file1,'d:\plik.txt'); 
      assign(file2,'d:\plik1.txt'); 
      reset(file1); 
      reset(file2); 
      IsSameFile := true;
      while not (eof(file1) or eof(file2)) do
      begin 
        read(file1,ch);
        read(file2,ch1);
        if(upcase(ch) <> upcase(ch1)) then
        begin
          IsSameFile := false;
          break;
        end;
      end; 
      if eof(file1) <> eof(file2) then
        IsSameFile := false;
        
      close(file1);
      close(file2); 
      if IsSameFile then
        writeln('Pliki sa takie same')
      else
        writeln('Pliki roznia sie'); 
      readkey; 
    end.
    

    ps. kod nietestowany.
    ps2. kod niezabezpieczony przed nieistnieniem plików
    ps3. można odrazu po otwarciu sprawdzić czy pliki mają taki sam rozmiar
  • #5 2205650
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    BoskiDialer:
    Na szczęście nie masz racji,nieuważnie przeczytałeś kod. Piszesz:

    zastosowanie while w while obie z warunkiem 'not eof' to katastrofajny sposób..

    Poniższy warunek skutecznie zapobiega zapętleniu się programu:

    if(ch<>ch1) then begin
    writeln('pliki sa rozne');readkey;close(odczyt);close(odczyt1);exit;end;

    Nawet gdy oba będą typu Y;Y+X,to w pewnym momencie ch będzie
    znakiem 0D (heksadec.,czyli zbliżamy się do końca pliku),a ch1 będzie jakimś znakiem(lub odwrotnie) i ch1<>ch. Po porównaniu nastąpi wykonanie komendy exit, a ponieważ znajduje się ona w kodzie głównego programu, zadziała jak halt i program zostanie przerwany.Wcześniej nastąpi zamknięcie plików.
    Prog. nie sprawdza istnienia plików,bo to nie było jego celem.Poza tym Pascal poinformuje "file not found".
  • #6 2206232
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    ed-ek: niechodzi o to że źle przeczytałem kod tylko najzwyczajniej go załączyłem i sie zawiesił. To co ty piszesz że w pewnym momencie ch=$0d a ch1 będzie innym znakiem już daje nam postać plików: X+Y i X+Z.. cały problem polega jeśli pierwszy plik jest dokładnie drugim plikiem powiększonym o conajmniej jeden znak to warunek ch<>ch1 nigdy niebędzie spełniony (oba pliki są identyczne do końca drugiego) ale dalej porównywanie niezachodzi ponieważ niejest spełniony warunek eof(odczyt1) i w ostateczności program sie zapętla w "while not eof(odczyt) do... "
  • #7 2206975
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Już zwątpiłem co robię.Aby sprawdzić,napisałem dwa najprostsze pliki pierwszy o zawartości S;co odpow. 53, 0D, 0A (heks); drugi S1-> 53, 31, 0D, 0A (heks)
    - program działa OK.Zamiana kolejności plików i porównanie też jest OK.Naprawdę nie rozumiem jak ci się zawiesza.
  • #8 2207116
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    ed-ek: to znaczy że naprawde niewiesz co robisz..
    jeśli masz te 2 pliki:
    [53,0D,0A]
    [53,31,0D,0A]
    to właśnie odpowiada szablonowi X+Y oraz X+Z gdzie X=[53] Y=[0D,0A] Z=[31,0D,0A]... z tym przypadkiem to działa ok.
    ale zrób 2 pliki w stylu:
    'd:\plik.txt' -> [53,0D,0A,31,0D,0A]
    'd:\plik1.txt' -> [53,0D,0A]
    tu masz przypadek X+Y i X (X=[53,0D,0A] Y=[31,0D,0A]) i na tym sie zawiesza

    w ostateczności w załączniku są pliki na których Twój kod sie wiesza
    Załączniki:
    • pliki.rar (158 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #9 2207548
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 42
    Tak masz rację.W tym wypadku istotna jest kolejność otwierania plików. Bardzo dziękuję za uwagę.Nie przemyślałem tego do końca.

Podsumowanie tematu

✨ Dyskusja dotyczyła napisania programu w Pascalu do porównania dwóch plików tekstowych z ignorowaniem wielkości liter. Zaproponowano kod wykorzystujący funkcję upcase do konwersji znaków na wielkie litery przed porównaniem. Wskazano jednak błąd w pierwotnym rozwiązaniu polegający na użyciu zagnieżdżonych pętli while z warunkiem not eof, co prowadziło do zapętlenia programu, gdy pierwszy plik był dłuższy od drugiego. Zaproponowano poprawkę polegającą na jednoczesnym czytaniu znaków z obu plików w jednej pętli i sprawdzaniu warunku zakończenia na podstawie obu plików. Dyskutowano również o przypadkach testowych, które ujawniały problem z zapętleniem, oraz o konieczności odpowiedniej kolejności otwierania plików. Program nie zawierał obsługi błędów istnienia plików, co zostało uznane za nieistotne w kontekście zadania.
Wygenerowane przez model językowy.
REKLAMA