C/C++ İle Kütük İşlemlerine Giriş
(694 kelime) (662 okuma) ![Yazdırılabilir Sayfa](images/print.gif)
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
|