Pascal, szövegfájl kezelés (sorok egyesítése) hogyan lehetséges?
Olyan programot szeretnék írni, amely szövegfájlból olvas be sorokat, két vagy több sort egyesít, meg van adva a sorhossz ami legyen például 75.
Ha a két sor hossza rövidebb mint 75 akkor átviszi és a következő sorral vagy sorokkal egyesíti amíg 75 nem lesz, tehát a fennmaradó maradékra is figyel.
Mivel legegyszerűbb ezt megcsinálni?
TStringlist-et kevésbé ismerem.
A nyelvtani szabályok most itt kevésbé foglalkoztatnak, meg a szóköz figyelembevétele is, az foglalkoztat leginkább, hogy logikailag egy ilyen hogy nézne ki.
program szovegfajl;
const
hossz = 75;
var
inf, outf : text;
s : string;
begin
assign(inf, paramstr(1));
reset(inf);
assign(outf, paramstr(2));
rewrite(outf);
while not eof (inf) do
begin
readln(inf,s);
writeln(outf,s);
end;
close(inf);
close(outf);
end.
Különösen az alábbi probléma érdekelne:
lenne 3 db 35 karakter hosszúságú sor, ezeket miként lehet összeadni úgy hogy "a maradékot a következő sorokhoz adjuk"?
Első kettőt simán egy sorba lehet írni, a harmadikból pedig fennmarad 5 karakter, a maradék és az utána következő sor figyelembevételével hogy lehet összeadni?
Logikailag ez a probléma érdekelne hogy bármilyen sorhosszra is működjön.
1. tipp:
Beolvasod az egész szöveges állományt egy string-tömbbe (feltételezhetően, nem nagy szöveges állományokról van szó), és aztán a tömb elemeit módosítod a leírtaknak megfelelően, majd végül kiírod a kimeneti állományba a módosított tömböt.
2. tipp:
a szöveges állományt nem szövegges állományként nyitod meg, hanem bináris állományként és elkezded byte-onként beolvasni (feltételezhetően a szöveg egyszerű ASCII és nem unicode-os) és kiírni a kimeneti állományba, amikor elérsz 75-ig (persze kihagyva a soremeléseket), akkor kiírsz egy soremelés(10) (+kocsivissza(13)) karaktert.
3. tipp:
beolvasol mindig 2 sort a szöveges állományból, megnézed, hogy a kettő sor hossza együttesen rövidebb-e mint 75, ha igen, akkor még beolvasod a 3-dik sort is és abból kipótolod a szöveg-eljárásokkal (Pl. Copy)...
#1-nek:
A problémát egy kicsit egyszerűsítsve nézzük meg.
Sorhossz: 12
1.string(A):"abcde"
2.string(B): "fghij"
3.string(C): "klmno"
Ekkor:
A=A+B
if length(A)<sorhossz then begin
A=A+Copy(C, 1, sorhossz-length(A));
Delete(C, 1, sorhossz-length(A));
end;
Egy kis javítás, bocs...
if length(A)<sorhossz then begin
D=sorhossz-length(A);
A=A+Copy(C, 1, D);
Delete(C, 1, D);
end;
Engem ez a string-es megoldás érdekelne, amit előzőekben ismertettél, a szövegfájl binárisként kezelése nem.
Logikusnak tűnik ez a string-es megoldás.
Itt beolvasom egy tömbbe, csak utána nem tudom a repeat-until ciklussal miként oldjam meg mert ha például a két szomszédos sor összege meg haladja a sorhossz értékét akkor "nem tudok mit tenni"...
program szovegfajl;
const
hossz = 75;
var
inf, outf : text;
s : string;
t : array[1..9999] of string;
i, j : word;
begin
assign(inf, paramstr(1));
reset(inf);
assign(outf, paramstr(2));
rewrite(outf);
i:=0;
while not eof (inf) do
begin
readln(inf,s);
inc(i);
t[i]:=s;
end;
j := 1;
close(inf);
close(outf);
end.
Eddig az összes hazugmondó féle "megoldás" rossz.
Megoldás:
while(not end of file)
__string data;
__do
____data += readline();
__while(data.Length < 75 and not end of file);
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!