Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tarvitaanko fclosea?

tgunner [12.04.2006 12:59:20]

#

Minulla on ollut tämä pulma jo vähän aikaa, se ei mitenkään haittaa koodauksiani, mutta täytyykö tiedostoa sulkea fclosella jos sen on avannut?

esim.

#include "stdio.h"

int main()
{
  char rivi[80];
  FILE *tiedosto;
  tiedosto = fopen("luku.txt", "r");
  fgets(rivi, 80, tiedosto);
  printf("%s\n", rivi);
  fclose(tiedosto);
  return 0;
}

Niin tuossahan suljetaan fclosella avattu tiedosto, mutta tarvittaanko sitä todella? Ja jos sitä tarvitaan, niin mitä haittoja on siitä, ettei sulje avattua tiedostoa?

Ja esim, jos kutsutaan jotain aliohjelmaa, ja mainissa on jo valmiina avattuna jonkinmoinen tiedosto, niin täytyykö se sulkea ennen aliohjelman kutsumista, tai voiko sen sulkea itse siinä aliohjelmassa?

Kiitos jo etukäteen.

A-P [12.04.2006 13:48:59]

#

Solariksen fclosea koskeva man-sivu sanoo, että kun fclosea kutsutaan tiedosto suljetaan, kaikki vielä kirjoittamaton data kirjoitetaan tiedostoon ja tiedostopuskuri vapautetaan. fclose myös päivittää tiedoston luonti- ja muutosaikaa. exit-käsky suorittaa fclose-käskyn automaattisesti joten, jos ohjelmat lopussa exit(n), fclosea ei tarvita. Pois jättämiselle on kuitenkaan näe mitään syytä.

tgunner [12.04.2006 13:59:26]

#

Ah, hienoa. Mutta suorittaako return-käsky fclosen automaattisesti kanssa? (Itse kyllä käytän exittiä aliohjelmassani, mutta mielenkiinnosta).

Deewiant [12.04.2006 14:52:51]

#

Käyttöjärjestelmä vapauttaa kyllä itse ohjelman käyttämät tiedostokahvat sen sulkeutuessa.

Niiden aukijättäminen voi kuitenkin haitata: muut ohjelmat eivät pääse muuttamaan avattujen tiedostojen sisältöä, joten jos ohjelma pyörii pitkään pitäen tiedostoja auki, aiheutuu muille ohjelmille häikkää.

Ajattele vaikka niin, että kun otat kirjastosta kirjan, on hyvätapaista panna se itse takaisin paikoilleen - mutta kuitenkin, jos jätät sen lattialle, kirjastonhoitaja tai siivooja laittaa sen kyllä hyllyyn. Muut asiakkaat (vai miksi niitä kirjastossa pitäisi sanoa) eivät kuitenkaan todennäköisesti nosta lattialta kirjaa ennen kuin em. hoitaja on vähän putsannut sitä ja laittanut sen hyllyyn, joten se on heiltäkin pois.

Tulipa hyvä analogia.

Antti Laaksonen [12.04.2006 16:43:40]

#

Deewiantin vertaus on aika hyvä.

Funktiossa oleva return ei sulje tiedostoa, sillä voihan olla niinkin, että tiedostoa halutaan vielä käsitellä funktion ulkopuolella.

Muutenkin tiedostoja voi availla ja sulkea missä kohtaa ohjelmaa tahansa, kunhan tiedosto-osoitin (FILE *) on tiedossa.

Kun fclosen kirjoittamisesta koodiin on kuitenkin varsin pieni vaiva, se kannattaa minusta joka tapauksessa.

koo [12.04.2006 20:24:55]

#

Tiedostoja ei tietenkään ole pakko sulkea eikä esimerkiksi muistia vapauttaa, jos voi luottaa käyttiksen hoitavan hoitavan nämä resurssijutut. Ihan aina ei tällaisia takeita ole. Resurssit voivat myös loppua kesken ennen ohjelman päättymistä ja resurssista riippuen toiset ohjelmat voivat myös kyllästyä odottelemaan omaa vuoroaan.

Funktiossa oleva return ei sulje tiedostoa, mutta funktio main on poikkeus: Siinä oleva return lopettaa ohjelman suorituksen hallitusti, jolloin fclose tehdään automaattisesti kaikille fopen:atuille tiedostoille.

Funktio exit myös lopettaa C-ohjelman hallitusti. C++-ohjelmassa sitä ei kuitenkaan kannata käyttää, kun jää destruktorit ajelematta.

Kyllä näissä C- ja C++-jutuissa on sellainen meininki, että kaikki varatut resurssit on syytä myös vapauttaa - jo ihan työturvallisuussyistä.

tgunner [13.04.2006 13:18:55]

#

Ah, selvisi tämäkin asia. Kiitoksia hienoista vertauskuvista. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta