Két szövegfájlból mondatok olvasása és kiírása egy harmadikba, hogyan lehetséges? (Pascal, bővebben lent)
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.
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.
É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.
Nagyon szépen köszönöm a megldást, rendkívül jól sikerült!
A novellák is nagyon tetszettek. :-)
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 ?
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. :-(
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!