Kezdőoldal » Számítástechnika » Programozás » Két szövegfájlból mondatok...

Két szövegfájlból mondatok olvasása és kiírása egy harmadikba, hogyan lehetséges? (Pascal, bővebben lent)

Figyelt kérdés

Következőt szeretném:

Első fájl első mondata és második fájl első mondata bekerülne egymás alá a harmadik fájlba.

Tovább ugyanígy, első fájl második mondata, második fájl második mondata...

Tehát a harmadik fájl mindkét fájl mondatait tartalmazná, egymás után...

A stringlist-megvalósítást sajnos nem ismerem.

Dinamikus tömbbel próbáltam (hogy annyi memória legyen lefoglalva amennyi kell), ami szépen kiakadt, ezért használok két statikus tömböt.

Annak megvalósítása nem megy, hogy miként dolgozzam fel beolvasás után a két tömböt...

Hogyan menjek el az írásjelekig és írjam ki, aztán lépjek a következő írásjelre...

A ".", "?", "!" írásjeleket figyelném és ez alapján írnám ki.

Előfordulhat, hogy a beolvasott string-ben nem található írásjel, csak a tömb következő sorában...

Karakterenkénti olvasás megvalósítása szükséges e hiba kiküszöbölésére, vagy ez a string-es jó lesz?

Elvileg a pos mindig jó pozíciót ad vissza, tehát nincs meg benne a 255 limit és mivel a $H+ be van kapcsolva, elég hosszú lehet a string...


Javaslatok?


{$MODE OBJFPC} {$H+}

program mondat;

var

s : string;

inf, outf, harmadik : text;

infc, outfc : longint;

inft, outft : array [ 0..10000 ] of string;

begin

Assign(inf, ParamStr (1 ) );

Assign(outf, ParamStr ( 2 ) );

Assign(harmadik, ParamStr ( 3 ) );

Reset(inf);

Reset(outf);

Rewrite(harmadik);

infc := 0;

outfc := 0;

while not Eof (inf) do

begin

ReadLn(inf,s);

inft [infc] := s;

Inc(infc);

end;

while Not eof(outf) do

begin

ReadLn(outf,s);

outft [outfc] :=s;

Inc(outfc);

end;

Close(inf);

Close(outf);

Close(harmadik);

end.



2015. szept. 28. 14:38
 1/7 A kérdező kommentje:
Hopsz, a második fájl változójának nem kellett volna "outf" változót adni, mert nem logikus.
2015. szept. 28. 14:56
 2/7 anonim ***** válasza:

Javaslom, használj bátran eljárásokat, mert segít átlátni a feladatot.


ciklus amíg nem eof(f1) és nem eof(f2)

> átmásol1Mondatot(f1,f3)

> átmásol1Mondatot(f2,f3)

ciklus vége


A másoló eljárás belül persze csekkolja az eof-ot az első paraméterben megadott fájlra, és csak akkor másol, ha van mit.


Magát a másolást én karakterenként csinálnám az átláthatóság kedvéért, de nyilván megoldható string-gel is (talán hatékonyabb is I/O szempontból).


Soronkénti olvasással:

Beolvasol egy sort, ha van benne mondatvégi írásjel, akkor ott elvágod, az első felét kiírod, a másodikat eltárolod. Következő beolvasást meg hozzáfűzöd. EOF-nál megnézed, van-e a memóriában sor töredék, és kiírod.

2015. szept. 28. 15:07
Hasznos számodra ez a válasz?
 3/7 SimkoL ***** válasza:

Én két Móra Ferenc novellával próbáltam ki, a file hibakezelést rád bízom :)


program mondat;


{$mode objfpc}{$H+}


var

  mondat1: array of string;

  mondat2: array of string;

  i, meddig: integer;

  f: Text;


  procedure szetszed;

  var

    f: file of char;

    s: string;

    ch: char;

    sorok: integer;

  begin

    Assign(f, 'mora1.txt');

    Reset(f);

    s := '1: ';  //csak a teszt kedvéért, aműgy s := '';

    sorok := 0;

    while not EOF(f) do

    begin

      Read(f, ch);

      if (Ord(ch) > 31) then s := s + ch; //a szóköztől kisebbeket eldobjuk

      if (ch = '.') or (ch = '?') or (ch = '!') then

      begin

        SetLength(mondat1, sorok + 1);

        mondat1[sorok] := s;

        s := '1: ';

        Inc(sorok);

      end;

    end;

    Close(f);

    Assign(f, 'mora2.txt');

    Reset(f);

    s := '2: ';

    sorok := 0;

    while not EOF(f) do

    begin

      Read(f, ch);

      if (Ord(ch) > 31) then s := s + ch;

      if (ch = '.') or (ch = '?') or (ch = '!') then

      begin

        SetLength(mondat2, sorok + 1);

        mondat2[sorok] := s;

        s := '2: ';

        Inc(sorok);

      end;

    end;

    Close(f);

  end;


begin

  szetszed;

  if Length(mondat1) > Length(mondat2) then

    meddig := Length(mondat1)

  else

    meddig := Length(mondat2);

  i := 0;

  Assign(f, 'morakevert.txt');

  ReWrite(f);

  while i < meddig do

  begin

    //vigyázunk nehogy túlszaladjunk a tömbindexen

    if Length(mondat1) > i then Write(f, mondat1[i] + #10#13);

    if Length(mondat2) > i then Write(f, mondat2[i] + #10#13);

    Inc(i);

  end;

  Close(f);

  SetLength(mondat1, 0);

  SetLength(mondat2, 0);

  WriteLn('Nyomj Enter-t');

  ReadLn;

end.

2015. szept. 28. 17:25
Hasznos számodra ez a válasz?
 4/7 SimkoL ***** válasza:
Itt [link] olvashatóbb.
2015. szept. 28. 17:49
Hasznos számodra ez a válasz?
 5/7 A kérdező kommentje:

Nagyon szépen köszönöm a megldást, rendkívül jól sikerült!

A novellák is nagyon tetszettek. :-)

2015. okt. 2. 02:33
 6/7 SimkoL ***** válasza:

Először két erotikus novellára gondoltam, hátha a keverésükből kijön egy pornófilm forgatókönyv, csak nem tudtam elmúltál-e már 18 éves :)

Érted is, a hibakezelést megoldottad ?

2015. okt. 2. 07:56
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:

Elmúltam 18 éves. :-)

A hibakezelés egyszerű, alapvetően gyakorlott vagyok Pascal-ban, csak néha bizonyos problémákra egyszerűen nem jövök rá, vagy nem találok megoldást. :-(

2015. okt. 3. 16:14

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!