Bu sayfadaki yazılar
Sayfanın metni
Sayfa 28
"wb" Yazmak için binary dosyasını açar.
"ab" Eklemek için binary dosyasını açar.
"r+" Okuma/yazma için ASCII dosyasını açar.
"w+" Okuma/yazma için ASCII dosyasını oluşturur.
"a+" Okuma/yazma için ASCII dosyasını açar.
"rb+" Okuma/yazma için binary dosyasını açar.
"wb+" Okuma/yazma için binary dosyasını oluşturur.
"ab+" okuma/yazma için binary dosyasını açar.
Burada dikkat ettiyseniz ANSI standardının getirmiş olduğu bir özellik olarak bir dosyayı hem ASCII, hem de binary olarak buffered file system'da açabiliyoruz.
fp değişkeni, FILE tipinde olup dosya pointer değişkeni olarak tanımlanır. FILE dosya structure'ı ise, <stdio.h> kütüphanesi içerisinde tanımlanmaktadır, fp dosya pointer'ı, fopen() ile verilen bir değer dışında değiştirilmemelidir.
Dosya adı, bir karakter dizisi şeklinde verilir. Dosya ismi bir directory altında olacak şekilde de tanımlanabilir (path belirleme).
Dosya açılmasına bir örnek verirsek:
#include <stdio.h>
main()
{
FİLE *fp:
fp = fopen("deneme","r"); if(fp == NULL) {
printf("Dosya bulunamadı"): 'exit():
} printf("Dosya bulundu"); fclose(fp):
}
Burada fp dosya pointer'ı olarak tanımlanıyor. Daha sonra 'deneme' adı altında bir dosya yalnız okuma amacıyla açılıyor. Eğer böyle bir dosya yoksa, 'Dosya bulunamadı' mesajıyla programdan çıkılıyor. Aksi takdirde 'Dosya bulundu' yazılarak açılan dosya kapanıyor ve program sona eriyor.
Buradaki NULL macro değişkeni 0 değerindedir. <stdio.h>'ta tanımlanmaktadır. Eğer fopen() dosyayı bulamazsa, NULL return koduyla geri dönmektedir.
Şimdi bir dosyayı yazma için açalım.
#include <stdio.h>
main()
{ FİLE *fp:
fp = fopcn( "deneme"."w"): if(fp==NULL) {
printff'Dosya açılamadı");
exit(); } fputs("veri",fp); fclose(fp);
}
Eğer dosya açılırsa, "veri" datası deneme dosyasına yazılıyor. Buradaki fputs() fonksiyonunun kullanımına dikkat edin. Normal puts() fonksiyonundan farklı olarak, bir de yazılacak olan dosya pointer'ını kullanıyor. Aynı şekilde, fgets() fonksiyonu da alacağı veriyi dosya'dan, dosya pointer'ı sayesinde alıyor. Kullanımlarına dikkat ettiyseniz, fgets() ve fputs() komutlarının kullanımı oldukça kolay. Tek fark dosya pointer'ına bağımlı olmaları.
Şimdi, fseek() fonksiyonuna gelelim. Bu fonksiyon dosya pozisyon göstergecini istenen pozisyona getirir. Bu komut sayesinde buffer'lı input / output sisteminde random olarak dosyadan okuma / yazma işlemleri yapılabilir. Genel kullanım şekli ise şöyledir;
fseek(fp, offset, origin);
fp, file pointer'ı yani dosyanın hafızada bulunduğu yer. 'offset' ise origin'den itibaren olan byte sayısı. Diğer bir deyişle, eğer biz origin'i başlangıç olarak kabul edersek, offset'i ise 10 verirsek, fseek komutu dosya pointer göstergecini dosyanın başlangıcından itibaren 10 byte ileri alacak şekilde bize hazırlayacaktır. Bu da bizim bir dosyaya random olarak ulaşmamızı sağlayacaktır. Burada origin üç şekilde olabilir:
değer origin 0 Dosya başı 1 Aktif pozisyon 2 Dosya sonu fseek() komutunun işlevi bu kadar. Sıra fprintf() fonksiyonuna geldi.
fprintf() fonksiyonu, printf() fonksiyonunun ekran için yaptığını dosya için yapar. Burada fprintf(), printf()'ten farklı olarak bir de dosya pointer değişkenini istemektedir. Genel kullanım şekli ise şöyledir:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 29
fprintf(fp,"kontrol dizisi",argument listesi);
Kontrol dizisi ve argument listesi printf() fonksiyonunda olduğu gibi işler. Bir örnek verelim;
#include <stdio.h>
main()
{
char c; . int a,b; FİLE *fp; fp = fopen("deneme","w"); if(fp == NULL) {
printf("Dosya açılamadı"); exit();
}
lsc;inf(stdin,"%d %d %e",&a,&b,&c); fprintf(fp,"%d %d %c",a,b,c); fclose(fp); }
fprintf() fonksiyonu, verilen değişkenleri dosyaya yazıyor. Bir de dikkat ettiyseniz fscanf() fonksiyonunu kullandık. Fakat burada bilgiyi bir dosyadan değil de klavyeden aldık. Dosya için stdin yerine fp kullanmalıyız. fscanf() fonksiyonunun genel kullanım şekli scanf()'e benziyor.
Sıra geldi fread() ve fwrite() fonksiyonlarına. Bu fonksiyonlar, birden fazla bilgiyi aynı anda dosyadan okuyabilir veya yazabilir. Genel kullanım şekli ise şöyledir:
fread(buffer,byte sayısı,adet,fp); fwrite(buffer,byte sayısı,adet,fp);
Burada buffer, veri için kullandığımız değişkeni veya alanı belirtiyor, byte sayısı ise okunacak veya yazılacak byte'ı, adet ise bu işlemin sayısını belirtiyor. Aşağıdaki örneği inceleyelim:
#include <stdio.h>
main()
{
char s[50J; FİLE *fp;
strcpy(s,"Deneme datası");
fp = fopen("deneme","w"); if(fp == NULL) {
printfC'Dosya açılamadı"): exit(): }
fwrite(s,strlen(s), 1 ,fp); fclose(fp); }
'Deneme' datası, deneme dosyasına 1 kez olmak üzere yazılacaktır. Adedi 2 verirsek, bu işlemi iki defa yapmış oluyoruz. Yani 'Deneme datası' arka arkaya iki defa dosyaya aktarılıyor.
feof() fonksiyonu, dosya sonuna gelip gelmediğimizi kontrol eder. Sıfırdan farklı bir sayı, dosya sonuna geldiğimizi gösterir. Kullanımı:
feof(fp); şeklindedir.
ferror(), bize varsa dosya hatasını bildirir. Yolladığı değer pozitif ise hata olduğunu, negatif ise hata olmadığını belirtir. ferror(fp); şeklinde kullanılır.
rewind() komutu, dosya pozisyon göstergecini başa getirecek şekilde hazırlar.
Kullanımı:
rewind(fp); şeklindedir.
Bu aylık buraya kadar. Gelecek ay, dosya işlemlerinin ikinci kısmı olan 'Unbuffered file system'i inceleyeceğiz. Böylece C'de oldukça önemli olan dosya işlemlerini de öğrendikten sonra, artık daha yeni programlara adım atabiliriz.
Gelecek ay yeni bir C yazısında buluşmak üzere hepinize iyi çalışmalar....