Ukládání do souboru – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukládání do souboru – Pascal – Fórum – Programujte.comUkládání do souboru – Pascal – Fórum – Programujte.com

 

Jan Sedlák0
Expert
9. 5. 2007   #1
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Mircosoft+1
Věrný člen
15. 5. 2007   #2
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
shark
~ Anonymní uživatel
38 příspěvků
15. 5. 2007   #3
-
0
-

chcem sa opytat, co robi ta kontrola I/O..

Nahlásit jako SPAM
IP: ...–
Mircosoft+1
Věrný člen
16. 5. 2007   #4
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý