Nacitam text ze souboru znak po znaku (je to nutne k vyreseni jedne ulohy) a potrebuju zjistit, jestli nebyly dva konce radku za sebou. Jak na to?
Printable View
Nacitam text ze souboru znak po znaku (je to nutne k vyreseni jedne ulohy) a potrebuju zjistit, jestli nebyly dva konce radku za sebou. Jak na to?
Napisu to obecne, do pascalu to snad neni uz problem presat :)
Psal jsem to rychle ale idea z toho je snad jasna :)Kód:char c,last;
do {
c=cti_znak();
if (c=eoln AND last=eoln)
{
// tady co chce provest pri dvou eoln po sobe
}
// tady co provadis normalne
last=c;
}while(eof);
Dik, ale tohle jsem tak nejak zkousel, problem je v tom, ze pri cteni ze souboru je eoln(f) booleovska hodnota a kdyz jsem si dal jeji hodnotu do watche, tak se pri cteni znak po znaku vubec nemenila. A protoze je to booleovska hodnota, kontroloval jsem ji vzdy po nacteni znaku, znak sam se ale eoln imho rovnat nemuze. Napada me snad leda reagovat na sekvenci dvojic znaku #13, #10 (tyhle dva prave konci radek)...
Alebo citaj cele riadky (readln) do stringu a z neho to mozes potom spracuvat po znakoch. A ked budu dva entery, tak dostanes prazdny string.
Rainbow, dik za radu, tohle jsem uz vlastne taky zkousel, problem je v tom, ze v zadani byla dana i moznost velmi dlouheho radku ve vstupnim souboru, pak je tusim problem s omezenim velikosti stringu.
Tak to cti binarne a hlidej CRLF dvakrat po sobe (DOS konec).Citace:
Původně odeslal Fx
String moze mat max. 255 znakov, takze ak tam moze byt dlhsi riadok, neda sa to pouzit.
Dlzku riadku si mozes pocitat aj rucne - pri kazdom znaku ju zvysis (okrem CR a LF), ked dojdes na CR a LF, tak skontrolujes, ci nie je nulova (vtedy boli 2 entery za sebou) a vynulujes.
Presne to jsem myslel temi znaky #13 a #10 (=CR a LF). Ted jsem dorazil domu, tak to prubnu, budu kvuli tomu ale muset ty procedury, co jsem mel hotovy, uplne prekopat. Ach jo :lol:Citace:
Původně odeslal hwsoft
Nevim co ti na tom nejde. S tim eoln(f) ti to musi fungovat, podle helpu eoln(f) je true pokud pozice v souboru je na konci radku nebo pokud je eof(f) true. Pri cteni znaku po znaku se eoln(f) nemeni a je porad false, dokud nenajedes na konec radku, pak by to melo vratit true. NAdefinuj si nejakou pomocnou promenou, na zacatku si ji nastav na false, nacti znak, zjisti jestli oeln(f) a pomocna promena sou oboje true, kdyz jo, mas za sebou 2 konce radku a podle toho neco udelej. Kdyz ne, tak zjisti jestli je eoln(f) true, v pripade ze jo, tak si nastav pomocnou promenou na true jinak na false. (zalezi teda jak to potrebujes kontrolovat, jestli kdyz budes mit konec radku za sebou 3x, jestli ti ma udelat tu akci pri 2 koncich radku za sebou 2x nebo jen jednou, jako jestli bude 2x konec radku za sebou pri 1 a 2 i pri 2 a 3, nebo jen pri 1. a 2. a 3. konec radku v rade uz se nebere).. neco jako tohle (spatlanej hnus :) ):
Kód:tmp:=false;
while not eof(f) do begin
znak:=read(f);
if eoln(f) then begin
if tmp then begin
// tady udelej tu akci co delas pri 2 koncich radku
end;
tmp:=true;
end else begin
tmp:=false;
// tady co delas normalne
end;
end;
MaPa: Mne by to taky prislo logicky, ale kdyz jsem zkusil proste jenom to lamat podle eoln (tj. to pole znaku vypsat, jakmile narazim na prvni eoln), tedy
if eoln(f) then vypis_obsah_pole_po_posledni_znak;
tak mi to naslo eoln(f) uprostred slova a vypsalo to jenom jeho kus, kdyz jsem tohle vynechal, tak se normalne do pole vlozilo... :evil:
Hmm.. to bych musel leda zkusit, doma, ted sem v praci.
No mne to proste blbne, ja uz fakt nevim, treba mam blby nastaveni compileru... A jinak, zda se mi, ze to tvoje reseni neresi dva konce radku bezprostredne za sebou, tj. CRLFCRLF, ale proste dva konce radku, ktery oba obsahujou nejakej text... Asi jsem to na zacatku nenapsal uplne jasne
Spravne, to se ti jen zda :)Citace:
Původně odeslal Fx
ak sem to doma nestoh nez sem odjel na sivlestra, tak nevim jestli to potrebujes jeste, ted sem to zkousel a zjistil sem ze eoln(f) de snad jen na soubor typu TEXT, a kdyz to pak ctes po znakach tak eoln(f) je pravda po precteni posledniho znaku na radku, jenze pak ctes 2 znaky #13 a #10, takze 2x eaoln pri cteni po znaku stejne nedocilis.. jedine pri eoln(f)=true precist 2x znaky naprazdno a pak muzes zas testovat jestli je za tim hned dalsi eoln(f)... kdybys to jeste nejak potreboval tak dej vedet.