Amiga Dünyası sayı 17, sayfa 27

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 27

Amiga severlere selam! Yazı dizimize, dosya işlemlerini daha derinlemesine inceleyerek devam ediyoruz. Geçen ay verdiğimiz kopya programı da dosya işlemleriyle ilgili bir örnek programdı. Bu ay biraz daha fazla açıklama yaparak konumuza devam edeceğiz.

Bildiğiniz gibi, bilgisayarla yaptığınız çalışmalarda verilerin emin bir yere kaydedilmesi gerekir. Bu nedenle dosyalama işlemlerinin sağlıklı yapılması çok önemlidir. Bu konuyu dosyalama işlemlerini buffer'lı input / output ve buffer'sız input / output (I/O) olmak üzere ayrı ayrı inceleyeceğiz.

C dilinde iki değişik UNIX standardı rutin mevcuttur. Bunlardan birincisi 'Buffered file system', ikincisi ise 'Unbuffered file system'dir. Birinci sistemde veriler buffer'dan geçirilerek işlem görürler. Bu sistem ASCII karakterlerden oluşan dosyaların okunup yazılmasında kullanılır.

İkinci sistemde ise buffer kullanılmaz. Bu sisteme binary sistem denir. Yani istenen formatta bilgiyi okuyup yazabilir.

ANSI (Amerikan National Standards Institute) standardı, 'Buffered file system'in geliştirilmiş halidir. Şu anda da en çok kullanılan sistem ANSI standardı sistemidir. Çünkü bu sistem hem 'text', hem de 'binary' dosyalama işlemlerini 'Buffered file system' kullanarak gerçekleştirmektedir. Biz de bu yazımıza 'Buffered file system' ile başlayacağız.

İlk olarak klavyeden (konsoldan) yapılan input / output'ları inceleyeceğiz. Klavyeden yapılan I/O'lar Buffered file system'in özel bir kullanım şeklidir. Bilgisayar açıldığında, klavyeyi otomatik olarak bir sıralı dosya sistemi gibi algılamaya başlar. Bu sistemi kullanan komutları daha önceki örneklerimizden de hatırlayacaksınız. Bu komutlar Aztec derleyicinizin içerisindeki <stdio.h> (Standard input / output) içerisinde tanımlanmaktadır. Bu nedenle bu fonksiyonları kullanmadan önce #include <stdio.h> satırını programımızın başına eklemeyi unutmamalıyız.

Stdio.h'ın içerisindeki fonksiyonlar hatırlayacağınız gibi; getchar(), putchar(), gets(), puts() komutlarıdır.

getchar() klavyeden tek bir karakter beklerken, putchar() fonksiyonu bir karakteri ekrana yazmak için kullanılır, getchar() ile girilen her karakter aynı zamanda otomatik olarak ekrana da yazılmaktadır. Örnek olarak aşağıdaki programı inceleyelim;

#include <stdio.h>

main()

{

char c;

printf("Çıkış için ! tuşuna basın."); do {

c=getchar(); putchar(c); } while(c !='!'); }

Bu program, '!' tuşuna basılana kadar girdiğimiz her karakteri ekrana yazarak tekrarlayacaktır.

gets() ve puts() fonksiyonları da aynı şekilde çalışmaktadır. Fakat getchar() ve putchar() komutlarının aksine, birden fazla karakter okuyup ekrana yazmak için kullanılırlar. gets() ile bir dizi karakter arka arkaya girilebilir. Dizinin tamamlanması enter tuşuna basmakla sağlanır. Enter tuşuna basıldığında dizinin sonuna boş bir karakter ilave edilerek, dizi tamamlanır. puts() ise bu dizinin tamamını ekrana yazar.

#include <stdio.h>

main() {

char dizi[30];

gets(dizi); puts(dizi); printf("Uzunluk = %d",strlen(dizi)); }

Yukarıdaki program gets() ve puts() için basit bir örnek.

Artık Buffer'lı dosyalama sistemine göz atmaya başlayabiliriz. Buffer'lı dosyalama işlemleri bir ara hafıza kullanmaktadır. Bu işlemleri yapan fonksiyonların tanımlamaları da C kütüphanelerinden <stdio.h>'ta yer almaktadır. Her dosyalama işlemi için programımızın başına '#include <stdio.h>' satırını eklemeyi unutmamalıyız.

Buffered file system'in kullandığı dosya işleme komutları ve fonksiyonları ise kısaca şöyledir:

İsim Fonksiyon fopen() Bir adet dosya açar. fclose() Bir adet dosyayı kapar. fputc() Dosyaya bir karakter yazar. fgetc() Dosyadan bir karakter okur. fputs() Dosyaya bir dizi yazar. fgets() Dosyadan bir dizi okur. fseek() Belirtilen bir byte'ı kütükte arar. fprintf() Printf()'in yaptığını, fprintf() dosya için yapar.

fscanf() Scanf()'in yaptığını, fscanf() dosya için yapar.

fread() Dosyadan birden fazla bilgi okur.

fwrite() Dosyaya birden fazla veri yazar.

feof() Dosya sonuna geldiğinde true yollar.

ferror() Bir hata oluştuğunda true yollar. rewind() Dosya pozisyon belirtecini, dosyanın başına getirir.

Buffer'lı dosya sisteminde çalışırken, bu dosya için <stdio.h>'ın içindeki FILE sistem structure'ı bir pointer olarak tanımlanır. Bu pointer'ın içinde dosya ile ilgili bilgiler saklanmaktadır. Şimdi bu komutların çalışmalarını inceleyelim.

fopen() komutu; bir dosyayı okuma, yazma veya ekleme olarak üç ayrı amaçla kullanıma açar. Daha sonra dosya yerini belirlemek için dosya pointer değeri ile ana programa geri döner. Böylece dosya hakkındaki bilgiler pointer'a aktarılmış olur. fopen() fonksiyonunun kullanımı, genel olarak şöyledir:

FİLE *fp; fp = fopen(dosya adı, modu);

Burada mod, ANSI standardına göre dosyanın açılma amacını belirler. Mod'un alabileceği değerler;

Mod Amacı …… ……….

"r" ASCII dosyayı okumak için açar. "w" ASCII dosyayı yazmak için oluşturur.

"a" ASCII dosyaya ekleme yapmak için açar.

"rb" Okumak için binary dosyasını açar.

Klavyeyle gezinmek için ← ve → tuşları.