Vytvoření souboru pokus.txt – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vytvoření souboru pokus.txt – Pascal – Fórum – Programujte.comVytvoření souboru pokus.txt – Pascal – Fórum – Programujte.com

 

Jeyekomon0
Stálý člen
24. 2. 2010   #1
-
0
-

Zní to jako jednoduchá věc! Nic na tom není - jen pár příkazů assign, rewrite apod..

Taky jsem si to myslel. Nechci sem chodit otravovat s každou maličkostí, tak jsem to nejprve zkoušel všemožně, ale po tom, co jsem bezúspěšně prošel asi půlku internetu, se musím zeptat.
Doufám, že to bude nějaká pořádná hloupost, ať se aspoň můžu stydět..

Na začátku nemám žádný .txt soubor a chci jej programem jednak vytvořit a jednak do něj zapisovat.
Po zkušenostech z google jsem vytvořil dva programy:

1. Od tohoto programu jsem přirozeně očekával, že hned vedle mého souboru pokus01.pas vytvoří ještě jeden, Fpokus01.txt.

program pokus01;

var T: text;
begin
assign(T, 'Fpokus01.txt');
rewrite(T);
writeln(T, 'ahoj');
close(T);
end.


2. Od tohoto souboru jsem očekával podobnou funkci, s tím rozdílem, že soubor Fpokus02.txt bude umístěn na C:\
program pokus02;

var T: text;
begin
assign(T, 'C:\Fpokus02.txt');
rewrite(T);
writeln(T, 'ahoj');
close(T);
end.


Tak a teď:
1. Program pokus01.pas žádný soubor Fpokus01.txt nevytvoří.
(Přestože program pokus02.pas jej vytvoří)

2. Ani když do složky k programu pokus01.pas přidám prázdný soubor Fpokus01.txt, tak s ním daný program nepracuje.

3. Třešnička na konec. Jsem sice trochu flegmatik, ale tohle bylo i na mě moc:
Tohle vše se děje, když program spouštím "během psaní" (tedy Compile, Execute). Když však spustím vzniklý soubor pokus01.exe, požadovaný soubor Fpokus01.txt už vznikne !!

Tak a teď babo raď. Příjde mi, že si ze mě pascal dělá srandu..
Ale vážně - opravdu bych potřeboval vysvětlit, proč se tohle všechno děje, vážně to nechápu :( .
A taky by mě zajímalo, co s tím - jak to rozumně naprogramovat tak, abych mohl případně někomu poskytnout tento zdroják (.pas) a on byl schopen ten program nějak rozumně spouštět, testovat apod.
Předpokládám, že uvádět absolutní adresu do programu je nesmysl a proto používat program pokus02.pas vůbec neuvažuju.


Díky za pomoc!
-----------------------------------------------------------------

PS: Firewall jsem vypnul, používám WinXP SP3, Dev-Pascal 1.9.2 :)

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
liborb
~ Redaktor
+18
Guru
25. 2. 2010   #2
-
0
-

Není to zase taková záhada. Při tvorbě programu (Compile ...) se ten soubor tvoří v aktuální adresáři což nemusí být adresář u výsledného exe souboru.

Nahlásit jako SPAM
IP: 85.207.166.–
KIIV
~ Moderátor
+43
God of flame
25. 2. 2010   #3
-
0
-

To liborb : presne.. mozna to najde u pascalovyho IDE :)

Autor: nejspis si zkus vypsat aktualni pracovni adresar z programu..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mircosoft+1
Věrný člen
25. 2. 2010   #4
-
0
-

Aktuální adresář se dá zjistit nebo změnit v dialogu File -> Change directory. Tedy aspoň v TP. Kdyby všechno selhalo, vždycky se dá použít vyhledávání podle jména a ten ztracený soubor najít.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jeyekomon0
Stálý člen
25. 2. 2010   #5
-
0
-

Aha. :)
No, tak jsem se trochu pídil po té Working directory (Dev-Pas je přece jen trochu komplexnější, než TP, takže jsem zatím možnost změnit Working directory přímo v menu nenašel) a narazil jsem přímo na funkci GetCurrentDir() v unitu Sysutils.
Tak jsem se dověděl, že soubory se opravdu vytvořily a to překvapivě :) v adresáři C:\Program Files\Dev-Pascal.

Pochopil jsem tedy, že když zadám do assign() pouze název souboru, pak se soubor vytvoří v defaultní Working directory.
Pokud v příkazu assign() ale uvedu absolutní cestu k souboru, tak jej už na požadované místo vytvoří.

Tak mě zajímalo - chtěl bych moc, kdybych chtěl nějakým způspobem v příkazu assign() místo absolutní cesty definovat pouze relativní cestu?
Něco ve stylu:

var path: String;

..
path := GetSourcePath; //Absolutní cesta k souboru pokus01.pas
assign(T, path+'files\Fpokus01.txt');
:))

Prostě, abych se, kdekoliv ten soubor otevřu, už nemusel starat o to, kde se mi uloží a vždycky se pěkně uložil hned vedle pokus01.pas..
A to, že v tom ".exe" už to funguje, radši příjmu jako fakt.. :)

Tak díky

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Mircosoft+1
Věrný člen
26. 2. 2010   #6
-
0
-

Zkus zavolat Paramstr(0), měl bys dostat aktuální (absolutní) cestu k programu včetně jeho jména. Nezkoušel jsem, jak to dopadne, když se program spouští z IDE a kompiluje se jenom do paměti.

Pracovní adresář u zkompilovaného EXE souboru je defaultně vždycky ten, ve kterém se EXE nachází, změnit se to dá jedině v jeho Vlastnostech. Potíže s přenositelností na jiné počítače proto nehrozí - kdo si spustí EXE, tomu se soubor vytvoří vedle něj. Kdo si otevře PAS, zkompiluje ho a spustí, tomu se vytvoří tam, kde to má ve svém kompilátoru nastavené, a to ze zdrojáku neovlivníš.

Relativní cesty použít jdou, vycházet budou vždycky z aktuálního pracovního adresáře.

Zkompilovaný exáč si o svém zdrojáku nepamatuje ani ťuk, natož aby věděl, kde se právě nachází (takže nějaká Getsourcepath už z principu prostě nemůže existovat). Samozřejmě, když znáš jeho jméno, můžeš ho přes volání příslušných služeb OS najít jako každý jiný soubor, ale to je asi tak všechno.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jeyekomon0
Stálý člen
26. 2. 2010   #7
-
0
-

Ten ParamStr() je přesně funkce, kterou jsem potřeboval! :)
Takže, vytvořil jsem toto:

program data_nearby;

uses sysutils;
var sourcePath: string;
dat: text;
begin
sourcePath:= ExtractFilePath(ParamStr(0));
assign(dat, sourcePath+'data.txt');
rewrite(dat);
write(dat, ' Success! ');
close(dat);
end.


Tak jo, funguje to - program nezávisle na tom, kde je globální working directory, uloží soubor data.txt pěkně vedle souboru ".pas". Chtěl jsem to použít i v opačném směru, kdy si testovací data přiložím k souboru a budu z nich moct načítat..

Tak a na závěr by se hodilo trochu kritiky, že? Totiž, přestože moc programovat neumím, tak i tak mi tohle právě předvedené řešení příjde tak trochu úsměvné.. Takže - ano, "funguje", ale jelikož ještě neznám moc programátorských dobrých mravů, tak nevím, jestli by tohle zrovna mělo být programátorovým cílem.

Aneb, i na freepascal.prg píšou:
In general, it's a bad idea to rely on the location of the binary. Often, this goes against best OS practices. Configuration data should (or can) not be stored next to the binary, but on designated locations. What locations these are, is very much operating system dependent. Therefore, ParamStr(0) should be used with care.

Takže by se nakonec hodilo pár doporučení, jestli takové počínání vlastně k něčemu je.. :)
Dík

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Mircosoft+1
Věrný člen
27. 2. 2010   #8
-
0
-

Tím chtěl autor říci, že by se měly využívat takové ty "standardní" adresáře typu Documents and settings\bla bla\Application data. Výhoda je v tom, že pak každý uživatel má jiný konfigurační soubor, i když se na něj program odkazuje pokaždé stejným způsobem (určitě existuje nějaká funkce "řekni mi aktuálně platnou cestu do adresáře Application data"). A že když zkopíruješ adresář s programem a přeneseš ho na jiný počítač, nepotáhne s sebou tvoje konfigurační soubory, bude to čistě jenom ten program. A navíc program správně poběží, i když bude celý jeho adresář read-only nebo nějak jinak chráněný.

Doporučení: tenhle systém používej pro uživatelské nastavení (např. rychlost myši, rozmístění ovládacích prvků a podobně), které bude chtít mít každý svoje a nebude chtít, aby mu ho někdo měnil, nebo v případě, že má být program umístěn na místě, kam nepůjde zapisovat.


Konfigurační soubory v adresáři s programem mají nevýhodu, že jsou společná pro všechny. V programu se to dá obejít (sady dat pro x uživatelů si můžš rozlišit vlastními prostředky), ale je to práce navíc. Při překopírování adresáře s programem s ním půjde i veškeré nastavení, se kterým na novém počítači třeba nemusí fungovat (to se dá vyřešit přečtením nějakých "unikátních" informací o hardwaru počítače (sériové číslo procesoru apod.) a jejich porovnáním s uloženými daty, aby se zjistilo, jestli na tomhle počítači program běží poprvé nebo ne, ale to je zase práce navíc). Naopak výhoda je v jednodušší přenositelnosti kódu (adresář s programem tu je vždycky, zatímco konfigurační adresář se v každém OS jmenuje jinak a v některých třeba vůbec není) a v kompaktnosti (tj. že program ze svého adresáře nevystrčí nos a nerozlézá se po celém systému).

Doporučení: tenhle systém používej pro data, která mají být společná, mají se šířit spolu s programem a jsou nezávislá na hardwaru (např. tabulky nejlepších výsledků ve hrách, definice pro antiviry apod.) nebo když jde o nějakou menší, jednorázovou utilitku, kde se spíš chce, aby šla po použití co nejpohodlněji smazat.

Nahlásit jako SPAM
IP: 93.91.144.–
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, 3 hosté

Podobná vlákna

Výpis souboru do txt — založil Odin

Přepsání txt souboru — založil Ramisha

Export do txt souboru — založil matouch

Zapracovani txt souboru — založil kniper84

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ý