Otevrene soubory - input, output – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Otevrene soubory - input, output – C / C++ – Fórum – Programujte.comOtevrene soubory - input, output – C / C++ – Fórum – Programujte.com

 

Earl Cash0
Věrný člen
12. 10. 2009   #1
-
0
-

Zdravim,
nezna nekdo zpusob jak zjistit, zda nebyl soubor otevren pro cteni i zapis? Vysvetlim. Mam program, ktery bere nazvy dvou souboru (zdrojovy, cilovy) pomoci parametru ve funkci main. Nejakym zpusobem bych potreboval overit, zda se nejedna o jeden a tentyz soubor, protoze to dela peknou neplechu... :)

Parsovat cestu zdrojoveho a ciloveho souboru, a nasledne porovnavat, se mi zda zbytecne, proto jsem spis zacal patrat v obsahu struktury FILE, jestli si nekde neuchovava adresu nebo identifikator jedinecny pro kazdy soubor...

Nejake napady, kde nastudovat obsah struktury FILE (hledal jsem primo v "hlubinach" stdio.h - bezvysledne), pripadne jak cely tento proces obejit, pokud mozno elegantne?

Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
KIIV
~ Moderátor
+43
God of flame
12. 10. 2009   #2
-
0
-

nestaci otevrit jako r+ pripadne binarne r+b ?.. pak by melo jit pouzivat fseek a podobne

a to jestli to neni stejnej soubor .. to je trochu problem.. v linuxu by to mozna mohlo jit pomoci stat a jestli to nehodi treba inode

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
12. 10. 2009   #3
-
0
-

Prostě bych vstup otevřel jenom pro čtení (i když třeba u programů pro windows to nebývá zvykem, ale je to opravdu naprosto normální věc) a výstup jenom pro zápis. Stačí ohandlovat chyby při otevírání. Není jedno, jestli se výstup nepodaří otevřít, protože je zároveň vstupem, nebo jenom proto, protože ho má zamčený zcela jiný program?

Nahlásit jako SPAM
IP: 89.203.160.–
bukaj_0010
Věrný člen
12. 10. 2009   #4
-
0
-

Earl Cash
Jak píše KIIV v POSIXových systémech to jde jednoduše pomocí ověření inode:

int same_file(FILE *first, FILE *second)

{
struct stat first_stat, second_stat;
fstat(fileno(first), &first_stat); // + ověření chyby
fstat(fileno(second), &second_stat); // + ověření chyby
return first_stat.st_ino == second_stat.st_ino;
}


I když teď nevím přesně, jak by tohle platilo pro symlinky…

Do FILE bych se rozhodně nehrabal, myslím, že standard C ani nespecifikuje, jak přesně ho musí daná libc implementovat.

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Earl Cash0
Věrný člen
12. 10. 2009   #5
-
0
-

To bukaj_001 : diky, zrovna jsem hledal nejakou referencni prirucku, kde bych vycetl pouziti... :)

Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
bukaj_0010
Věrný člen
12. 10. 2009   #6
-
0
-

ondra.holub
Prostě bych vstup otevřel jenom pro čtení a výstup jenom pro zápis. Stačí ohandlovat chyby při otevírání.
Jenom pro zápis znamená mód w, nebo a. Jenže w všechno ze souboru vysype, takže i když budu mít již připravený druhý FILE otevřený pro čtení, nebude co číst. Při a se zase bude přidávat na konec souboru, takže budu nakonec číst data, která jsem právě zapsal, a pravděpodobně to skončí chybou. Nebo mi něco uniká?

Earl Cash
Jinak jsem ještě hledal a Windows ekvivalent by nemuselo být zas tak složité[1], viz soubor stat.c a tam fce fileino(). Jen by to chtělo najít nějakou fci, která z FILE udělá Windowsí HANDLE. Ale v tom se vůbec nevyznám :o) Navíc, nemám možnost otestovat.

zrovna jsem hledal nejakou referencni prirucku, kde bych vycetl pouziti
Pokud nemáš manuálové stránky přímo u sebe, tak nejlepší je to Google (kupodivu). Zadáš man stat, man fileno a už se jede.

[1] http://gnuwin32.sourceforge.net/packages/stat.htm

Nahlásit jako SPAM
IP: 88.101.128.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
ondra.holub+1
Stálý člen
12. 10. 2009   #7
-
0
-

To bukaj_001 : enom pro zápis znamená mód w, nebo a. Jenže w všechno ze souboru vysype, takže i když budu mít již připravený druhý FILE otevřený pro čtení, nebude co číst. Při a se zase bude přidávat na konec souboru, takže budu nakonec číst data, která jsem právě zapsal, a pravděpodobně to skončí chybou. Nebo mi něco uniká?

Neuniká. Prostě je zbytečně neefektivní mít vstup i výstup ve stejném souboru. Nejlepší je mít vstup stdin a výstup stdout a uživatel si s tím už udělá co chce (přesměruje z/do jiného souboru, uloží na filesystém apod.). Pokud takto zkusím použít stejný soubor pro obojí, dojde k chybě. A o to jde - stejný soubor pro vstup i výstup je obvykle zbytečný. (Vždycky se dá vstup nebo výstup přejmenovat.)

Nahlásit jako SPAM
IP: 89.203.160.–
Earl Cash0
Věrný člen
13. 10. 2009   #8
-
0
-

Pokud nemáš manuálové stránky přímo u sebe, tak nejlepší je to Google (kupodivu). Zadáš man stat, man fileno a už se jede.

v manu jsem nasel pouze pouziti utility "stat", ale zadnou syntaxi... to same "info stat"...ale google uz mi pomohl, takze vyreseno... :)

je to konsolova utilita pro linux, takze zavislosti ve windowsech neresim...

Nahlásit jako SPAM
IP: 217.197.150.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
bukaj_0010
Věrný člen
13. 10. 2009   #9
-
0
-

Earl Cash
v manu jsem nasel pouze pouziti utility "stat", ale zadnou syntaxi...
Systémová volání jsou stránky typu 2 a knihovní funkce (libc) zase 3, takže: man 2 stat nebo man 3 stat určitě něco vyhodí (v tomto případě man 2 stat, jelikož stat je systémové volání) :o)

Nahlásit jako SPAM
IP: 84.242.107.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Earl Cash0
Věrný člen
16. 10. 2009   #10
-
0
-

earlcash@leviathan:~/dev/fubar$ man 3 stat

No manual entry for stat in section 3
See 'man 7 undocumented' for help when manual pages are not available.

nejspis nemam stahnutou dokumentaci...instaloval jsem jenom zakladni system (Debian)...

Nahlásit jako SPAM
IP: 193.85.177.–
Oh my goodness, shut me down! Machines making machines. How perverse. (C-3PO)
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, 18 hostů

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ý