[Pascal]Operacje na plikach...

0

Witam. Mam pewien problem z programem.
Otóż mam do napisania program w którym mam 2 pliki(txt) wejściowe i 1 wyjściowy(txt). W 1 pliku znajduje się jakiś tekst, w 2 pliku wzorzec np(ko,lak,jak itp.). Dany wzorzec jest przypisany do danej linii czyli :
Przykład:
Plik 1
Nazywam sie Stanislaw
W sklepie jest duzo promocji

(Tych linii może być dużo )

Plik2:
zy
le

I w pliku 3 ma być coś takiego:

zy 3
mo 5

Liczby (3,5) są to miejsca w których wystąpił wzorzec.
Linii tekstu ma być tyle ile wzorców.

Prezentuje mój kod który napisałem jednak nie działa poprawnie:

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
var tekst,wzor:string;
var a,i,j,pozycja,n,pomocnicza:integer;
var ftekst,fwzor,wy1:TextFile;
var result:boolean;

begin
assign(ftekst,'we1.txt');
reset(ftekst);
assign(fwzor,'we2.txt');
reset(fwzor);
assign(wy1,'wy1.txt');
rewrite(wy1);
n:=0;
WHILE NOT EOF(ftekst) DO
 begin
 readln(ftekst,tekst);
 readln(fwzor,wzor);


 for i:=1 to length(tekst) do
      if tekst[i]=wzor[1] then
       begin
        for j:=1 to length(wzor) do
         begin

          if wzor[j]=tekst[i+j-1] then write(wy1,wzor,'     ',j)
          else writeln;

         end;
        end;


end;
Closefile(ftekst);
Closefile(fwzor);
Closefile(wy1);

end.

Pozdrawiam.

0

Twój kod niesformatowany, a więc sorry, ale czytać się mi go nie chce. Zrob tak, pod Delphi działa.
Jednak poniższy kod jest w takiej składni, że pod Turbo czy Free Pascalem się powinien skompilować.
I miało nie być gotowców ode mnie, ale pokazaleś, że coś tam kombinowałeś samodzielnie, poza tym
co jest nadal rzadkością zarejesteowałeś się na tym forum, także taki prosty kod - mogłem napisać i
widzę tylko na szybko, że u siebie coś kombinowałeś z treścią wzorca, ale wystarczy zwykła funkcja
Pos, bo jak zrozumialem w pliku wynikowym poraz treścią wzorca ma być jego pierwsze wystąpenie.

program droppek_zad;

{$APPTYPE CONSOLE}

const
  ZdaniaPlik_Nazwa = 'we1.txt';
  WzorcePlik_Nazwa = 'we2.txt';
  WynikiPlik_Nazwa = 'wyj.txt';

var
  X : integer;
  Zdanie, Wzorzec : string;
  ZdaniaPlik, WzorcePlik, WynikiPlik : TextFile;
begin
  Assign(ZdaniaPlik, ZdaniaPlik_Nazwa);
  Reset(ZdaniaPlik);
  if IOResult = 0 then
  begin
    Assign(WzorcePlik, WzorcePlik_Nazwa);
    Reset(WzorcePlik);
    if IOResult = 0 then
    begin
      Assign(WynikiPlik, WynikiPlik_Nazwa);
      Rewrite(WynikiPlik);
      while not EOF(ZdaniaPlik) do
      begin
        Readln(ZdaniaPlik, Zdanie);
        Readln(WzorcePlik, Wzorzec);
        X := Pos(Wzorzec, Zdanie);
        Writeln(WynikiPlik, Wzorzec, ' ', X);
      end;
      Close(ZdaniaPlik);
      Close(WzorcePlik);
      Close(WynikiPlik);
      Writeln(WynikiPlik_Nazwa, ' zostal utworzony.');
    end
    else
    begin
      Writeln('Problem z otwarciem pliku: ', WynikiPlik_Nazwa);
    end;
  end
  else
  begin
    Writeln('Problem z otwarciem pliku: ', ZdaniaPlik_Nazwa);
  end;
  Readln;
end.
0

W Twojej wersji program wypisuje położenie pierwszego napotkanego wzorca, dalej już nie sprawdza.
I mam pytanie co oznacza IOResult ?

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
var tekst,wzor:string;
var i,j:integer;
var ftekst,fwzor,wy1:TextFile;
var result:boolean;

begin
assign(ftekst,'we1.txt');
reset(ftekst);

assign(fwzor,'we2.txt');
reset(fwzor);

assign(wy1,'wy1.txt');
rewrite(wy1);

WHILE NOT EOF(ftekst) DO
 begin
 readln(ftekst,tekst);
 readln(fwzor,wzor);
  for i:=1 to length(tekst) do
   if tekst[i]=wzor[1] then
    begin
     for j:=1 to length(wzor) do
      begin
       if wzor[j]=tekst[i+j-1] then
        begin
         write(wy1,i);
         break;
        end

       end;
     end;
  end;


Closefile(ftekst);
Closefile(fwzor);
Closefile(wy1);




end. 

Poprawiona wersja, liczy jednak nie wiem jak napisać z przodu wzorzec i wypisać wzorce w odpowiedniej linii.

0

Bo tak zrozumiałem treść zadania, zresztą poza błedem przykładzie wyjścia, bo powinno być chyba "le 5" informację, że ma być
tyle zdań ile wzorców rozumiem że jeden wzorzec na jedno zdanie. A co do IOResulr IOResult

0

Racja, mój błąd. Jednak dalej nie wiem jak to wypisać w linii wszystkie wzorce.
Czy tam ma pojawić się pętla for ? Bo próbuje i na razie nic .
Olesio może jakaś uwaga ? Bo naprawdę nie wiem.

0

Teraz powinno być ok. Dla pliku
we1.txt

Nazywam sie Daniel Dzyndzel
W moim sklepie jest duzo promocji

oraz we2.txt

zy
mo

Zwraca w wej.txt to:

zy 3 zy 17 
mo 3 mo 25 

Także kod raczej ok, a jak nie to sobie już coś samodzielnie dopasuj. Bo dobry program i tak został napisany za Ciebie ;/

program droppek_zad;

{$APPTYPE CONSOLE}

const
  ZdaniaPlik_Nazwa = 'we1.txt';
  WzorcePlik_Nazwa = 'we2.txt';
  WynikiPlik_Nazwa = 'wyj.txt';

var
  X : integer;
  Zdanie, Wzorzec : string;
  ZdaniaPlik, WzorcePlik, WynikiPlik : TextFile;
begin
  Assign(ZdaniaPlik, ZdaniaPlik_Nazwa);
  Reset(ZdaniaPlik);
  if IOResult = 0 then
  begin
    Assign(WzorcePlik, WzorcePlik_Nazwa);
    Reset(WzorcePlik);
    if IOResult = 0 then
    begin
      Assign(WynikiPlik, WynikiPlik_Nazwa);
      Rewrite(WynikiPlik);
      while not EOF(ZdaniaPlik) do
      begin
        Readln(ZdaniaPlik, Zdanie);
        Readln(WzorcePlik, Wzorzec);
        X := Pos(Wzorzec, Zdanie);
        while X > 0 do
        begin
          Delete(Zdanie, 1, X + Length(Wzorzec) - 1);
          Write(WynikiPlik, Wzorzec, ' ', X, ' ');
          X := Pos(Wzorzec, Zdanie);
          if X = 0 then
          begin
            Writeln(WynikiPlik);
          end;
        end;
      end;
      Close(ZdaniaPlik);
      Close(WzorcePlik);
      Close(WynikiPlik);
      Writeln('Plik: ', WynikiPlik_Nazwa, ' utworzony.');
    end
    else
    begin
      Writeln('Problem z otwarciem pliku: ', WynikiPlik_Nazwa);
    end;
  end
  else
  begin
    Writeln('Problem z otwarciem pliku: ', ZdaniaPlik_Nazwa);
  end;
  Readln;
end.
0

Liczbę drugiego wzorca nie liczy od początku lecz od miejsca w którym wystąpił wzorzec 1... kurde

0

Oj, "no kurde". Pisane na szybko, wkradl się błąd, bo nie pomyślałem, ale Ty już mógłbyś majać tyle przykładów ruszyć
samodzielnie głową i poprawić. Wedlug mnie to teraz jest dobrze, ale jak znowu coś nie gra - to pomyśl sam, i popraw.

program droppek_zad;

{$APPTYPE CONSOLE}

const
  ZdaniaPlik_Nazwa = 'we1.txt';
  WzorcePlik_Nazwa = 'we2.txt';
  WynikiPlik_Nazwa = 'wyj.txt';

var
  Zdanie, Wzorzec : string;
  TymczasowaPozycja, PozycjaWzorca : integer;
  ZdaniaPlik, WzorcePlik, WynikiPlik : TextFile;
begin
  Assign(ZdaniaPlik, ZdaniaPlik_Nazwa);
  Reset(ZdaniaPlik);
  if IOResult = 0 then
  begin
    Assign(WzorcePlik, WzorcePlik_Nazwa);
    Reset(WzorcePlik);
    if IOResult = 0 then
    begin
      Assign(WynikiPlik, WynikiPlik_Nazwa);
      Rewrite(WynikiPlik);
      while not EOF(ZdaniaPlik) do
      begin
        Readln(ZdaniaPlik, Zdanie);
        Readln(WzorcePlik, Wzorzec);
        TymczasowaPozycja := Pos(Wzorzec, Zdanie);
        PozycjaWzorca := TymczasowaPozycja;
        while TymczasowaPozycja > 0 do
        begin
          Delete(Zdanie, 1, TymczasowaPozycja + Length(Wzorzec) - 1);
          Write(WynikiPlik, Wzorzec, ' ', PozycjaWzorca, ' ');
          TymczasowaPozycja := Pos(Wzorzec, Zdanie);
          PozycjaWzorca := PozycjaWzorca + TymczasowaPozycja + 1;
          if TymczasowaPozycja = 0 then
          begin
            Writeln(WynikiPlik);
          end;
        end;
      end;
      Close(ZdaniaPlik);
      Close(WzorcePlik);
      Close(WynikiPlik);
      Writeln('Plik: ', WynikiPlik_Nazwa, ' zostal utworzony.');
    end
    else
    begin
      Writeln('Problem z otwarciem pliku: ', WynikiPlik_Nazwa);
    end;
  end
  else
  begin
    Writeln('Problem z otwarciem pliku: ', ZdaniaPlik_Nazwa);
  end;
  Readln;
end.

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