Ve škole děláme Pascal cca tři čtvrtě roku a nyní poprvé děláme trochu těžší projekt. Pracujeme na programu, který slouží k uchovávání, editaci, čtení, mazání a podobným funkcem se sopkami. Každá sopka má 4 parametry - Název, Stát, Výška a jestli je činná (string, string, integer, boolean). Používáme tedy pole[1..10] of seznam, přičemž seznam je record of nazev,stat:string, vyska:integer, cinnost:boolean. Základní program už vytvořený mám, chci proto program udělat "k něčemu" a zavést ukládání seznamu sopek do externího souboru. Zápis hodnot do souboru mi problém nedělá,
procedure ukladani(q:pole);
var i:byte;
Begin
Assign(soubor,'data.raz');
{$I-}
Reset(soubor);
if IOResult<>0 then Rewrite(soubor);
{$I+}
Write(soubor,q);
Close(soubor);
end;
chtěl bych ale proceduru, kterou můžu při opětovném startu programu načíst zpět seznam sopek, s tím, že každá sopka se uloží do prvku pole záznamu (uloží se její jméno do q.nazev, stát do q.stat, výška do q.vyska, činnost (boolean) do q.cinna) a ještě se nastaví seznam zaplněných prvků (v příkladu používám proměnnou i, volanou odkazem jako w), aby uživatel mohl pokračovat s uloženým počtem sopek. Chcete li zdrojový kód, napište si o něj.
Fórum › Pascal
Ukládání do souboru
Ukládat můžeš pevný počet sopek a ty nevyužité nějak označit, třeba prázdným jménem. Pak můžeš ze souboru rovnou načíst celé pole. Jestli chceš ukládat jenom ty využité, pomůře funkce Eof(soubor), která vrací true, pokud už jsi dočetl na konec souboru:
type PoleSopek=array[1..neco] of zaznam;
function NactiSopky(var kam:polesopek):word;
var soubor:file of seznam;
i:byte;
Begin
i:=0;
Assign(soubor,'data.raz');
reset(soubor);
if ioresult=0 then
begin
while not eof(soubor) do read(soubor,pole[i+1]); {dokud je co cist, cti}
{i+1 tu je proto, ze pole indexujeme od 1, ale i ma predstavovat i pocet sopek, ktery muze byt 0}
close(soubor);
end
else writeln('Soubor neexistuje nebo nesel otevrit.');
nactisopky:=i; {funkce vrati pocet nactenych sopek. Slo by to zaridit i pres parametr volany odkazem.}
End;
Mimochodem, v tom tvém kódu vidím, že zkoušíš otevřít soubor Resetem. Ten ale otvírá pro čtení. Jestli do něj chceš zapisovat, používej vždy Rewrite. Do režimu, kdy jde číst i psát, se dostaneš (tuším) použitím procedury Seek (která normálně hledá určitou pozici v souboru, ale jako vedlejší efekt udělá i tohle).
A nezdržuj se zbytečně opětovným zapínáním kontroly I/O ({$I+}), stejně k ničemu není. Vypni ji jednou na začátku programu a hotovo.
Moje stránka.
Když je zapnutá (zapíná se direktivou {$I+} nebo přes menu Options -> Compiler -> I/O checking), tak při každé chybě I/O (tj. při práci se soubory - otvírání, zavírání, čtení, zápis atd.) program automaticky spadne a vypíše příslušnou chybovou hlášku. Zároveň se nedá úspěšnost těchto operací testovat IOresultem (protože program spadne dřív, než můžeme IOresult zavolat).
Když je vypnutá ({$I-} nebo zase přes menu), tak při chybě program nespadne a pokračuje dál. Zároveň se nastaví nějaký interní chybový kód, což způsobí, že od chvíle, kdy se objeví chyba, BUDOU VŠECHNY DALŠÍ OPERACE SE SOUBORY IGNOROVÁNY. Tento chybový kód můžeme přečíst funkcí IOresult. Když je 0, žádná chyba nenastala (tj. minulá I/O operace proběhla úspěšně). Pokud není nula tak ano. IOresult kromě vrácení chybového kódu zároveň ten interní chybový kód VYNULUJE, což znamená, že 1) operace se soubory půjdou opět provádět a 2) když zavoláme IOresult několikrát po sobě a mezitím neprovedeme žádnou I/O operaci, vrátí skutečný chybový kód jenom napoprvé a v dalších případech bude vracet nulu.
Moje stránka.
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
Ukládání do souboru — založil Scrat
Ukládání do souboru — založil blizzard384
Ukladani do souboru — založil Qvido
Ukládání do souboru — založil Ukládání do souborů?
Ukládání do souboru — založil fix
Moderátoři diskuze