Nyní mám problém se čtením souboru až do konce, ale nevím proč.
if fR=1 then begin
assign(compile,filename);
assign(temp,'System/Temporary.txt');
rewrite(temp);
reset(compile);
repeat q:=0; OC:='';
readln(compile,O);
d:=integer(O[0]);
for k:=1 to d do
begin
p:=char(O[k]);
if ((p='G')or(p='M')or(p='X')or(p='Y')) then q:=1;
if q=1 then OC:=OC+p;
end;
writeln(temp,OC)
until eof(compile);
Na písmena G,M,X,Y narazí vždy, na jedno z nich na každém řádku.
Ono to ten soubor přepíše celý, ale několik málo posledních řádků ne prostě.
Udám jako příklad: soubor má 10 000 řádků, ale překopíruje jich pouze 9 995. 100 000, překopíruje pouze 99 995.
Proč?!?!?!?
Fórum › Pascal
Nedokončování čtení souboru.
Asi nejpravděpodobnější příčina je to, že jsi soubory před ukončením programu nezavřel (příkaz Close(soubor)). Je možné, že se z nějakého důvodu nezavřely automaticky a posledních pár řádků zůstalo někde v nějakém bufferu v paměti a ne zapsaných na disk.
Další věc: pro jaký OS kompiluješ?
Jestli pro DOS, tak pozor, že jméno souboru může být maximálně 8 znaků dlouhé ("Temporary" už je moc).
Jestli pro DOS, Windows nebo prostě cokoli jiného než Unix nebo Linux, tak pozor, že adresáře se oddělují zpětným lomítkem ("\") a ne normálním ("/").
Tohle by mohl být závažný problém, ale s nedočítáním konce souboru nesouvisí.
Co automatická kontrola I/O {$I+ nebo -}? Máš ji zapnutou nebo vypnutou? Možná by se vyplatilo zkontrolovat, jestli při čtení souboru nedošlo k nějaké chybě.
Kdyžtak sem hoď i definice všech proměnných, takhle se můžu jenom dohadovat o jejich typech a významu, protože takovéhle jednopísmenné zkratky nic neřeknou.
Prakticky všechny chyby se dají najít při krokování: na vhodné místo si dej breakpoint (najeď kurzorem na řádek a zmáčkni Ctrl+F8). Na něm se program zastaví a přes Watches (Ctrl+F7) můžeš kontrolovat aktuální hodnoty proměnných, klávesou F8 krokovat po řádcích nebo Ctrl+F9 zase rozjet normální rychlostí.
A ještě pár drobných připomínek, bez vlivu na funkci:
Jestli dobře chápu, že O je string, tak délku čti jako byte a ne jako integer, aby nehrozilo, že se do ní zahrnou první dva bajty místo jednoho. Nebo ještě lépe funkcí Length. Ale to už je spíš otázka vkusu. A jestli p je typu char, tak je explicitní přetypovávání při čtení znaků řetězce zbytečné.
> if ((p='G')or(p='M')or(p='X')or(p='Y')) then q:=1;
Kdyby bylo q typu boolean, dělaly by se s ním logické podmínky pohodlněji (místo "q:=1" by bylo "q:=true" a místo "if q=1" jenom "if q"). A ta podmínka se dá zapsat i pohodlněji jako "if p in ['G','M','X','Y'] then...". To ovšem nejsou chyby.
Moje stránka.
To Mircosoft : :D
Tak tos mě teda úplně tozbil, takový kvantum informací :D
Mno, co sem pobral a eště chápal, programuju pro Windows, přičemž uses používám dos,crt.
Ale teďkon jsem zkusil uzavřít ten soubor a ono to tam je!!!! JUpíííííí :D
Nj,ono asi pul milionu řádků se jen tak na rychlo neuloží do toho souboru než se ten program zavře :)
A tamty všechny ostatní rady ... to si ještě několikrát přečtu a snad to pochopím jakym jazykem kromě Pascaloviny si to na mě mluvil :D
Děkuju moc
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
čtení ze souboru — založil Jakub Vojáček
čtení ze souboru — založil witsarah
Cteni ze souboru — založil Mory
Cteni souboru. — založil ewzen
Čtení souboru ve VB — založil hansk
Moderátoři diskuze