C/C++ İle Kütük İşlemlerine Giriş

C/C++ İle Kütük İşlemlerine Giriş

//    Bildiginiz gibi dosyalar oyunların ayrılmaz parcalarından biridir.
//    Oyunda kullanılan modeller,ortamlar,dokular, oyunla ilgili ayarlar vb.
//    birçok öğe dosyalarda bulunur.Dolayısıyla dosya işlemlerini iyi bilmemiz
//    gerekmektedir.

//    Dosya işlemleri şu şekilde gerçekleşir:
//    Önce dosya açılır.Sonra dosyadan veri okunur,veya dosyaya yazılır.
//    Bu arada dosya göstergeci de (ekrandaki imlecin yazdığımızda hareket etmesi gibi)
//    dosyaya yazıldıkça veya okundukça dosya üzerinde hareket eder.Mesela dosyanın
// başındayken 3 byte'lık bir veri yazdığımızda artık dosya gostergecinin degeri 3 olur.
//    Dosya ile işimiz bitince bir çırpıda dosyayı kapatırız.

//    Önce C'de dosya işlemlerinde sık kullanılan fonksiyonlara bir göz atalım.
//    Örneklerde de bu fonksiyonları kullanacağız.Aşağıdaki fonksiyonlar <stdio.h>
//    kütüphanesinde tanımlanmıştır..


// fopen() : FILE *fopen(char *filename,char *mode)
   
//    -> filename ile belirtilen dosyayi 2.parametrede verilen modda acar.
//        Eger fopen başarılı olursa geriye FILE tipinde bir adres döndürür.
//        Dosya acılamazsa geriye NULL gösterici döner.
//        Sık kullanılan modlar(ikinci parametre):
//        "r" : Sadece okuma.Dosya diskde bulunmalıdır.
//        "w" : Sadece yazma.Dosya yoksa oluşturulur.Var olan dosyanın icerigi silinir.
//        "a"    : Dosyaya ekleme yapmak icindir.
//        "r+" : Dosyadan hem okuma hem yazma icin.
//        "t"    : text dosyayı(örn: "rt" metin dosyasından okuma)Bu dosyaların herhangi bir text
//            exitoru ile içeriği elde edilebilir.

//        "b"    : binary dosya (binary dosyalarda veriler bilgisayarın belleğindeki saklandığı
//            gibi saklanır.Dolayısıyla bu tip dosyalari text editoruyle açtığınızda
//            acayip karakterlerle karşılaşırsınız.Çoğu dosya bu tipdedir.

//        Mesela 300.032102 sayısını text dosyasında saklarsanız her bir karakter 1 byte dan
//        10 byte tutar.Ama binary dosyada saklarsanız bu bir float sayı olduğundan ve de
//        float tipi bellekte 4 byte'la saklandığından dosyada da 4 byte yer kaplayacaktır.   


//    fclose() : int fclose(FILE *fp)
//        -> Açılmış olan bir dosyayi kapatmakta kullanılır.Açılan dosyalar
//        kapatılmazsa problemler çıkabilir(Özelliklede yazım yapıldıysa)

//    fprintf() : int fprintf(FILE *fp,const char *format,argumanlar)
//        -> Dosyaya formatlı yazım yapar.Aynı printf gibidir.Ama ekrana değil
//        dosyaya yazar.

//    fscanf() : int fscanf(FILE *fp,const char *format,argumanlar)
//        -> scanf gibidir.Dosyadan formatlı okumada kullanılır.
//        Geriye yapabildiği atama sayısını döndürür.

//    fputs()    : int fputs(char *str,FILE *fp)
//        -> puts()'a benzer.Dosyaya bir string yazmakta kullanılır.

//    fgets()    : char *fgets(char *str,int n,FILE *fp)
//        -> gets()'e benzer.Dosyadan string okumakta kullanılır.
//        yeni satır karakteriyle("\n") karşılaşıncaya kadar okuma yapar.

//    feof()    : int feof(FILE *fp)
//        -> Dosya sonuna gelindiyse 1,aksi takdirde 0 değeri geri döner.

//    Henüz pek bir anlam ifade etmeyen bu fonksiyonlar aşağıdaki örnekler anlaşılabilir.

//    Sıklıkla kullanılan fread(),fwrite(),fseek() fonksiyonlarını ikili dosyalarda
//    kullanmak üzere ilgili dökümana saklıyorum.
//                        
//    Bu örnekte önce bir y=x2 parabol(bir çeşit eğri)'unun koordinatlarını oluşturup bu
// veriyi dosyaya yazacağız.
//    Sonra bu dosyadan koordinatları alıyoruz.

//    Olmazsa olmaz, her derde deva kütüphanemiz stdio.h
#include <stdio.h>
#include <stdlib.h>
//exit() fonksiyonu için

void main(void)
{

    // Dosya ile bir takım bilgileri saklamak için FILE tipinde bir pointer tanımlamalıyız.
    // Tüm dosyalarla ilgili fonksiyonlarda, yukarıda da gördüğünüz gibi,bu değişken
    // mutlaka parametrelerde geciyor.
   
 
  FILE *fp;

    // Oluşturacağımız parabolun koordinatlarını tutacak değişkenler.
  
float x,y;
   
    // "dosya.dat" isimli dosyayi "wt":text modunda,ve yazmak için açıyoruz.
    // Dosya yoksa oluşturuluyor.Ve dosya işaretcisi dosyanın başına hareket ediyor.
 
  fp=fopen("dosya.dat","wt");
   
    // Eger herhangi bir sebepten dolayı dosya acılamadıysa programı sonlandırıyoruz.
 
  if(fp==NULL) {
        puts("Dosya açılamadı");
        exit(0);
    }

   
    // x'e -5 den 5 e kadar 0.25 birim arayla değer verip buna karşı gelen y degerini hesaplayıp
    // parabol koordinatlarımızı dosyaya yazıyoruz.
    // dikkat ettiyseniz %f %f arasına virgul koydum.Ne de olsa formatlı yazıyoruz.
  
for(x=-5 ; x<=5 ; x+=0.25){
        y=x*x;
        fprintf(fp,"%f,%f\n",x,y);
    }

   
    // dosyayı kapatmayı unutmuyoruz
    fclose(fp);

    // Artık dosyaya istedigimiz bilgileri yazdık.İsterseniz herhangi bir metin
    // editöru(wordpad,notepad,vs...) yardımıyla dosyanın içini görebilirsiniz.
    // Dosyayı tekrar acalım fakat bu sefer okuma amacıyla "rt" modunda acalım.
  
fp=fopen("dosya.dat","rt");
   
    // Eger herhangi bir sebepten dolayı dosya acılamadıysa programı sonlandırıyoruz.
   
if(fp==NULL) {
        puts("Dosya açılamadı");
        exit(0);
    }
   

    // fscanf() 'in okuma yapabildiği yere kadar okuyoruz.Yani aşağıda fscanf
    // 2 (x ve y) değişkene atama yapıyor.Dosya sonuna geldiğinde atama yapamaz ve
    // döngüden çıkar.Dosyamızda veri örneğin "-5.000000,25.000000" şeklinde saklandığından
    // dolayı bizde %f %f arasına virgün koyduk.Yani formatlı okuduk.
   
    // fgets() ile dosyayın satırlarını stringler şeklinde okuyabilir ve bu stringlerden
    // istediğimiz değerleri sscanf yardımıyla alabilirdik.Mesela bir satırdaki x ve y'i
    // char str[255]
    // fgets(str,255,fp)
    // sscanf(str,"%f %f",&x,&y);
    // ile okuyabilirdik.
    while(fscanf(fp,"%f,%f\n",&x,&y)>0){
   
    // burda printf ile koordinatları ekrana yazmanın pek bir anlamı yok ama siz basit bir
    // GLUT veya SDL uygulamasıyla bu koordinatları dosyadan alıp, ekrana çizip,
    // hatta parabol denkleminde değişikler yapıp evde, işyerinde, okulda eğlenceli
    // dakikalar geçirebilirsiniz:)
   
   
    printf("%f,%f\n",x,y);

    }

   
    // dosyayı kapatalım.
   fclose(fp);
}


// Sonraki dökümanda Wavefront'un *.obj dosya tipini ele alıp, ilgili bir GLUT
// uygulması hazırlayacağız.İyi çalışmalar

UzMaN :: 2003 :: www.oyunyapimi.org




Bu yazının bulunduğu site: OyunYapimi.org
http://www.oyunyapimi.org

Bu yazı için adres:
http://www.oyunyapimi.org/modules.php?name=Sections&op=viewarticle&artid=25