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?
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?
Brum brum, nezavazne...
Napisu to obecne, do pascalu to snad neni uz problem presat
Psal jsem to rychle ale idea z toho je snad jasnaKó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)...
Brum brum, nezavazne...
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.
1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm
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.
Brum brum, nezavazne...
Tak to cti binarne a hlidej CRLF dvakrat po sobe (DOS konec).Původně odeslal Fx
ITF FreeNet Liberec
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.
1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm
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 joPůvodně odeslal hwsoft
![]()
Brum brum, nezavazne...
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...![]()
Brum brum, nezavazne...
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
Brum brum, nezavazne...
Spravne, to se ti jen zdaPů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.
Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)