Citat:
Znam da FILE *outfile pravi pokazivac na FILE tip radi kasnijeg kreiranja filea, ali mi nije jasno sta uradio ovaj dio iza znaka =
Pre poziva
fopen(),
FILE *outfile je običan pokazivač koji ne pokazuje ninašta validno,
a jeste predviđen da pokazuje na neki fajl stream, i to u slučaju uspešnog izvršenja
fopen().
Ukoliko kao rezultat
fopen() vrati neku vrednost različitu od NULL, ta vrednost će označavati
adresu fajl stream-a odakle se može čitati. Ukoliko vrati NULL, došlo je do greške u pristupu fajlu, i pointer
nije validan (biće postavljen na NULL od strane fopen).
Citat:
FILE *outfile=(FILE*)NULL;
Osnovni uzrok ovakvih izraza je što C++ ne definiše koju vrednost će imati outfile pre fopen(), tj. pri deklaraciji
generalno.
Ovde je autor eksplicitno dodelio NULL pointeru
outfile, najverovatnije bespotrebno (treba videti veće
parče koda), jer po standardu svakako će vrednost biti NULL ako dođe do greške. Ono (FILE*) je cast-ovanje,
tj. izjednačavanje po tipu sa leve strane izraza, da se kompajler ne bi (eventualno) pobunio.
Dakle, moglo je i:
Code:
FILE *outfile=NULL;
// ili:
FILE *outfile=0;
// ili samo:
FILE *outfile; // <-- u slučaju fopen greške, svakako će biti NULL.
Doduše, ja takođe volim da koristim eksplicitne dodele NULL pointera (mada nije po principima), pogotovo kada
imam puno pointera u nizu koji se instanciraju jer imam veću slobodu da kasnije za sobom počistim smeće ako
slučajno dođe do greške usred procedure, npr:
// PSEUDO
Code:
// ...
FILE *p1 = NULL;
FILE *p2 = NULL;
FILE *p3 = NULL;
// ...
{
p1 = fopen()
// neki break u slučaju greške koji zaobilazi p2 i p3
p2 = fopen()
// neki break u slučaju greške koji zaobilazi p3
p3 = fopen()
// neki break u slučaju greške koji zaobilazi ostatak koda koji se oslanja na ispravnost pointera
}
// ...
ciscenje()
// ...
void ciscenje()
{
if ( p1 )
fclose( p1 );
if ( p2 )
fclose( p2 );
if ( p3 )
fclose( p3 );
}
... ovim se kao osigurava da neka slučajna vrednost p1 ili p2 ili p3 dođe na fclose(), što dovodi do greške.