Yazdığınız program verileri klavyeden okumak yerine sabit bir ortamdan
alacaksa veya ekrana yazmak yerine sabit bir ortama yazacaksa
programınızda dosya işlemleri yapmak zorunda kalacaksınız. Dosyayı
açmak okuma-yazma yapıp geri kapatmak zorunda kalacaksınız. O halde
bu konuya bir göz atmanız gerekecektir.
Dosya Türleri ve erişim
Hemen her programlama dilinde olduğu C Programlama dilinde de genel
olarak iki tür dosya bulunmaktadır. Bunlardan birincisi Sıradan erişimli
(Sequential), diğeri de doğrudan ya da rast gele erişimli (Random) olarak
bilinirler. Her programlama dili ve işletim sistemi için şu genel kurallar bu
iki dosya türü için geçerlidir.
Sıradan Erişimli Dosyalar
Sequential ACCESS
Bir dosya sadece okumak ya da
yazmak için açılabilir. Aynı anda bir
dosya hem okunup hem de yazılamaz
Bu dosyalarda kayıt uzunlukları sabit
değildir. Dosyadaki her bir kayıt bir
satırdır ve satır sonu işareti ile
sonlandırılmıştır. Dosya da dosya
sonu (EOF) işareti ile
sonlandırılmıştır
Bir kayda doğrudan erişim söz
konusu değildir. Örneğin 8. kaydı
okumak isterseniz ilk 7 kaydı da
okumanız gerekecektir okumalar tek
yönlü ve ileriye doğrudur. Yani önceki
kayda erişip okumaya çalışamazsınız.
Dosyaya sadece yazabilir veya
sadece okuyabilirsiniz.
------------------------------
Doğrudan ya da rastgele erişimli
dosyalar
Random ACCESS
Bir dosya aynı anda hem okunup hem
yazılabilir.
Bu dosyalarda ise kayıtlar sabit
uzunlukludur. Yani her bir kaydın kaç
byte yer işgal ettiği programcı
tarafından bilinir ve her okumada ve
yazmada o kadar byte okunup-yazılır.
Bu nedenle kayıt sonu işareti
bulunmaz ve Dosya sonu işaretinin de
fazla bir önemi yoktur. Esas olan
dosyanın toplam uzunluğudur.
Bir kayda istenildiği anda doğrudan
erişebilirsiniz. Bu kaydın sırası
bilindiği takdirde okuma yapılabilir. Bu
nedenle geriye doğru okuma yapmak
mümkündür.
Dosyaya hem yazabilir hem de
okuyabilirsiniz
Genellikle metin Dosyaları, Belgeler, Program dosyaları ve benzeri dosyalar
sıradan erişimli dosyalar iken, Bilgi kayıt dosyaları gibi dosyalar doğrudan
erişimli dosyalardan seçilirler.
Metin Dosyaları
Öncelikli olarak bu şekilde bir dosyanın tanıtılması gerekir bu amaçla da
FILE adında bir tür ile tanımlanmış bir değişken olmalıdır.
Dosya açma işlemi
Bir dosyanın üzerinde işlem yapabilmek için mutlaka dosyanın açılarak
program ile ilişkilendirilmesi gerekir.
Bir dosyayı açabilmek için öncelikle bu dosyayı sembolize edecek bir
değişkene ihtiyacımız bulunmaktadır. Bu değişken FILE değimi ile
tanımlanmaktadır.
FILE *dosya;
ifadesi adı dosya olan ve disk üzerinde bir dosyayı belirtecek olan
mantıksal bir dosya tanımlar. Daha sonra bu tanıma göre dosya şu şekilde
açılır:
fp=fopen("deneme.dat","r");
Burada dosyamızın adının deneme.dat olduğu varsayılmıştır. Bu dosya
okuma amaçlı olarak açılmış olup bundan sonra dosyanın program içinde
fp adıyla anılacağı öngörülmüştür.
Eğer dosya açılabilmiş ise fp o dosyaya bir gösterge değeri tutar. Eğer
dosya herhangi bir nedenle açılamamış ise fp'nin değeri 'NULL' dir (Yani
BOŞ).
dosya_değişkeni=fopen("dosya_adı","dosyanın_modu");
Bu biçim kullanımda dosya_değişkeni FILE değimi ile tanımlanmış olan
değişken olmalıdır. "dosya_adı" açmak istediğimiz dosyanın disk üzerindeki
tam konumunu ve adını belirtmelidir. "dosyanın modu ise aşağıdakilerden
biri olabilir:
r: Dosyanın sadece okumak için açılacağını belirtir. Bu şekilde açılacak
dosya mutlaka sistem üzerinde bulunmalıdır aksi halde hatalı bir sonuç
alınır.
w: Dosyanın sadece yazmak için açılacağını belirtir. Bu şekilde açılacak bir
dosya sistem üzerinde oluşturulacaktır. Buna dikkat edilmelidir. Eğer bu
dosya var ve "w" modu ile açılıyorsa dosya silinerek yerine yenisi
konulacaktır.
a: Dosyanın sona ekleme için açılacağını belirtir. Dosya yoksa yeni
oluşturulacak var ise öncekinin sonundan yazmak üzere hazır hale
gelecektir.
getc c=getc(fp) şeklinde kullanılır ve fp ile temsil edilen dosyadan 1
karakter okuyup c değişkenine getirir.
fscanf fscanf(fp, "biçim tanımları", değişkenler) şeklinde
kullanılır. Bildiğimiz scanf gibi çalışmaktadır. Ancak klavyeden değil de
bilgileri fp ile temsil edilen dosyadan okumaktadır. Biçim tanımları kısmı
normal scanf komutu ile aynıdır.
Dosyaya yazma
putc putc(fp, c) şeklinde kullanılır ve fp ile temsil edilen dosyaya c
değişkenindeki 1 karakteri yazar.
fprintf fprintf(fp, "biçim tanımları", değişkenler) şeklinde
kullanılır. Bildiğimiz printf gibi çalışmaktadır. Ancak sonucu ekrana değil de
fp ile temsil edilen dosyaya yazmaktadır. Biçim tanımları kısmı normal
printf komutu ile aynıdır.
Dosya kapama
fclose dosyaların program tarafından işleri bitmiş ise kapatılmaları gerekir.
Kapatma komutu için fclose(fp); kullanılmalıdır
Doğrudan Erişimli Dosyalar
Doğrudan erişimli dosyalarda da program içerisinde bu dosyayı sembolize
edebilecek bir değişkene ihtiyaç duyulur. Ancak bu tip dosyalarda bu
değişken int tipindedir.
Dosya açma işlemi
int dosya;
şeklinde tanımlanır.
dosya=open("deneme.dat");
disk üzerinde adı deneme.dat olan bir dosyayı doğrudan erişimli olmak
üzere açacaktır.
dosya_değişkeni=open("dosyanın_fiziksel_adı"); şekliyle genel
tanım yazılabilir.
Bu şekilde bir dosya açılınca dosyanın program içinde temsil edilebilmesi
için bir değer programa döndürülür ve bu değer dosya_değişkeninde
saklanır. Eğer bu değer -1 ise bu dosya bir takım nedenlerden dolayı
açılamamıştır. Sonraki Okuma, Yazma vb. işlemlerde dosyamızın bu
numarasını kullanarak işlem yapmamız gerekecektir.
Bu dosyaların açma komutlarının biraz farklı olduğunu görmüş olmalısınız.
Bu nedenle okuma yazma komutları da biraz farklı olacaktır.
Dosyadan okuma
read read(dosya_no,okunanlar,okunacak_byte); şeklinde kullanılır. Bu
fonksiyon ile doğrudan erişimli dosyadan okuma yazma kafasının
bulunduğu noktadan itibaren okunacak_byte kadar karakter okunarak
okunanlar dizisine yerleştirir. Sonuç olarak bu fonksiyon okuduğu karakter
sayısını döndürür.
Dosyaya yazma
Yazma işlemi için write komutu kullanılmaktadır. Bu Komut
write(dosya_no, yazılacaklar, yazılacak_byte); biçiminde kullanılır.
Bu tanımda dosya_no bilgilerin yazılacağı dosyayı temsil eder. Yazılacaklar
içerisinde yazılacak bilgilerin bulunduğu diziyi ifade eder. yazılacak_byte
ise dosyaya kaç byte bilgi yazılacağını belirtir. Bu fonksiyon yazılanların
toplam kaç byte olduğunu geri döndürür. Eğer -1 değeri dönmüş ise
yazmada bir sorun ile karşılaşılmış demektir.
Dosya kapama işlemleri
Bu şekilde açılan bir komutun kapatılması için close(fp); komutu
kullanılır.
Doğrudan erişimli dosyalara özel durumlar.
Bu tip bir dosyada okuma yazma kafasının konumunu okuma ya da yazma
yapmadan değiştirmek mümkündür. Bu amaçla kullanılan bir lseek
fonksiyonu bulunmaktadır. lseek(dosya_no, mesafe, nereye_gore);
şeklinde kullanılır. Burada dosya_no kafa hareketinin hangi dosyada
yapılacağını belirtir. mesafe kafa hareketinin kaç byte olacağını belirtirken
(sayısal bilgi) nereye_gore bilgisi bu hareket miktarının nereye göre
yapılacağını belirler (Dosya başına göre, dosya sonuna göre ve bulunduğu
yere göre).
r (read only) yalnızca okuma için açar.
w (write only) yalnızca yazma için açar.
a (append) ekleme yapmak için açar.
r+ Okuma/yazma için açar.
w+ Okuma/yazma için açar.
a+ Okuma/yazma için açar.
Basit örnek:
#include<stdio.h>
int main()
{
FILE *dosya;
fptr =fopen("output.txt","w+");
fprintf(dosya,"merhaba dunyaa");
fclose(dosya);
return 0;
}
Hiç yorum yok:
Yorum Gönder
Her yorum bilgidir. Araştırmaya devam...