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?
Fórum › C / C++
Otevrene soubory - input, output
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
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?
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.
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
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.)
v manu jsem nasel pouze pouziti utility "stat", ale zadnou syntaxi... to same "info stat"...ale google uz mi pomohl, takze vyreseno... :)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.
je to konsolova utilita pro linux, takze zavislosti ve windowsech neresim...
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)
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)...
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
Otvírat soubory v již otevřené aplikaci — založil Petr
Copy to output directory — založil Hanesis
Linux screen output pomocí PHP — založil Tomáš Fiala
Jak provázat soubory, když chci využít třídu A pro objekt B a každá… — založil PazziCZ
Input a input type — založil
Moderátoři diskuze