Rezimy otvorenia suboru pomocou funkcie fopen()

18.01.2008 | 21:15 | Programovanie | srigi
Funkcia fopen() ma nasledujuci funkcny prototyp:
FILE *fopen(const char *meno, const char *rezim);
Rozne vyznamy parametru rezim:
r textovy subor pre citanie
w textovy subor pre zapis alebo prepisanie
a textovy subor pre pripojenie na koniec
rb binarny subor pre citanie
wb binarny subor pre zapis alebo prepisanie
ab binarny subor pre pripojenie na koniec
r+ textovy subor pre citanie a zapis
w+ textovy subor pre citanie, zapis alebo prepisanie
a+ textovy subor pre citanie a zapis na koniec
rb+ binarny subor pre citanie a zapis
wb+ binarny subor pre citanie, zapis alebo prepisanie
ab+ binarny subor pre citanie a zapis na koniec
pozn.
Ak otvoris existujuci subor v rezime "w" alebo "wb", tento subor sa najskor vymaze a potom sa znovu zalozi. Dochadza teda k prepisaniu suboru.

Ak otvoris existujuci subor v rezime "a" alebo "ab", tak sa tento subor otvori a ukazatel pozicie sa posunie na jeho koniec. Dochadza teda k rozsireniu existujuceho suboru (append). Ak subor neexistuje, tak sa vytvori.

Ak pouzijeme rezim rozsireny o znak "+", je mozne subor pouzit zaroven pre citanie aj zapis, co ma ale prakticky vyznam iba pri binarnych suboroch.

No a nakoniec nejaky jednoduchy priklad prace s textovym suborom aj s testovanim uspesnosti otvorenia suboru.

Program zkopiruje subor ORIG.TXT do suboru KOPIA.TXT, testovanie konca suboru zabezpecuje symbolicka konstanta EOF
#include <stdio.h>

void main()
{
  FILE *fr, *fw;
  int c;

  if ((fr = fopen("ORIG.TXT", "r")) == NULL) {
    printf("Subor ORIG.TXT sa nepodarilo otvorit\n");
    return;      /* ukoncenie programu */
  }


  if ((fw = fopen("KOPIA.TXT", "w")) == NULL) {
    printf("Subor KOPIA.TXT sa nepodarilo otvorit\n");
    return;      /* ukoncenie programu */
  }

  while ((c = getc(fr)) != EOF)
    putc(c, fw);

  if (fclose(fr) == EOF) {
    printf("Subor ORIG.TXT sa nepodarilo zavriet\n");
    return;      /* nevhodne */
  }

  if (fclose(fw) == EOF) {
    printf("Subor KOPIA.TXT sa nepodarilo zavriet\n");
    return;      /* zbytocne */
  }
}
Program obsahuje jednu logicku chybu. Ak sa totiz podari otvorit pre citanie subor ORIG.TXT ale subor KOPIA.TXT by sa pre zapis nepodarilo otvorit, program by skoncil a subor ORIG.TXT by ostal otvoreny a bude ho musiet zavriet operacny system. Tato chyba nie je velka, nakolko sa o zavretie vsetkych suborov po skonceni programu postara OS, ale nie je dobrym programatorskym zvykom sa na tuto funkciu spoliehat. Vhodne je tuto situaciu osetrit programom, ale to uz necham na vas.

História úprav