Amiga Dünyası sayı 18, sayfa 35

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 35

Bu ay, geçen ay kaldığımız buffer'lı olmayan input/output tipi dosyalama rutinlerine devam edeceğiz. Dosyalama işlemleri bittikten sonra, bu ayki ikinci konumuz Amiga'da screen açılımı ve bazı grafik komutlarının kullanımı. Şimdi kaldığımız yerden devam edelim.

C dili UNIX sisteminde geliştirildiği için, bu sırada ikinci bir input/output sistemi de yaratılmıştı. Bu sisteme buffer'lı olmayan input/output sistemi deniliyor ve ANSI standardına göre tamamen farklı makine diline daha yakın rutinler kullanılıyor. Bu sistemde buffer düzenlemesini, programcı olarak sizin yapmanız gerekmektedir. Unix tipi fonksiyonlar şunlardır: Fonksiyon İşlevi read() Bir buffer dolusu data okur. write() Bir buffer dolusu data'yı yazar. open() Diskte dosya açar. close() Diskte mevcut dosyayı kapatır. lseek() Belirtilen byte'ı dosyada arayarak bulur. unlink() İstenilen dosyayı siler.

Makine koduna daha yakın yani alçak seviyedeki bu sistemde FILE tipi dosya pointer'ı olmadığından, onun yerine dosya tarifi int ile yapılmaktadır. Bir dosya açmak için;

int fp; fp=open(dosya adı, mod); yazılır. Burada mod; 0, 1, 2 değerlerini alabilmektedir. Bunlar da sırasıyla oku, yaz ve oku/yaz anlamına gelir. Dosyayı kapatmak içinse, close(fp); fonksiyonu kullanılır. Eğer open() ile yeni bir dosya açma imkanı yoksa creat() fonksiyonu kullanılır. Kullanım şekli open() ile aynıdır. Dosya açıldıktan sonra write ile dosyaya bir şeyler yazmak mümkün:

write(fp,buf,length); Burada fp file pointer'ını, buf yazılacak olan hafıza bloğunun başlangıç adresini, length ise yazılacak olan verinin uzunluğunu belirtiyor. read() fonksiyonu da aynı formda fakat diskten veri okumak için kullanılıyor.

AMIGA

unlink() fonksiyonu, diskten bir dosyayı silmede kullanılır. lseek() fonksiyonu ANSI standardındaki fseek() fonksiyonuna benzer şekilde çalışır.

lseek(fp,offset,origin); Burada offset dosyanın bulunduğu yeri byte cinsinden tespit eder. Bunun için de, origin parametresine bakar. Origin parametresi 0, 1 ya da 2 olabilir. 0, dosya başı; 1, o andaki pozisyon; 2, dosya sonunu belirtir.

Aşağıdaki örnek program diskten her- hangi bir dosyayı siler. Sileceğimiz dosya ismini main() içerisinden alıyoruz. main(argc, argv) int argc; char *argv[];

{ int a;

if(argc!=2) return(); a=unlink(argv[l]); if(a!=-l) { printf("%s dosyası

silindi!\n",argv[l]); ) else ( printf("dosya

silinemedi\n"); } }

Buffer'sız input/output işlemleri bu kadar. Buraya kadar anlattığımız dosyalama işlemlerini Amiga'da rahatlıkla kullanabilirsiniz. Fakat bunların dışında, yalnız Amiga'da kullanılan input/output fonksiyonları da mevcut. Bu fonksiyonlar Amiga'nın 'dos.library'si içerisinde mevcut. Amiga programcılarının hemen hepsi tarafından kullanılan bu rutinler, Amiga'nın sistem rutinleridir. Assembler dahil her dilde bu rutinleri kullanabilirsiniz.

Şimdi Amiga'daki dos.library rutinlerine bakalım. Bu rutinleri kullanmadan önce dos.library'yi açmamız gerekiyor; çünkü kullanacağımız rutinler bu library içerisinde.

Sistem, Buffer'lı olarak çalışıyor ve makine dilinde hazırlanmış. Bu nedenle oldukça hızlı. Komutlar ANSI veya UNIX'teki rutinlerin kullanımıyla hemen hemen aynı.

dos.library'yi açtıktan sonra file pointerini şöyle tanımlıyoruz:

struct FileHandle *file; Buradaki FileHandle yapısı C disketinizdeki include file'lar arasında, dos.h içerisinde tanımlanıyor. Bu nedenle programımızın başına bir de '#include <libraries/dos.h>' cümlesini eklemeliyiz.

Bu sistemin kullandığı fonksiyonların bazıları şunlar: Fonksiyon İşlevi Open() Dosya açar. Close() Dosyayı kapar. Write() Buffer dolusu bilgiyi yazar. Read() Buffer dolusu bilgiyi okur. Seek() Dosya pozisyon göstergecini ayarlar. Fonksiyonların hemen hepsi ANSI ve UNIX sistemindeki rutinlerin aynısı. Dikkat ettiyseniz, sistem komutlarının baş harfleri büyük olarak kullanılmış. Siz de aynı şekilde yazmaya dikkat edin. Şimdi, aşağıdaki örnek programı inceleyelim: #include <stdio.h> #include <libraries/dos.h>

struct DosBase *DosBase; struct FileHandle *file;

main()

{ DosBase=OpenLibrary("dos.library",0); if(DosBase==NULL) j

printf("dos.library açılamadı!.\n"); return(l); 1 file=Open("deneme",MODE_NEWFILE); if(file==NULL) (

printf("Dosya açılamadı.Nn"); CloseLibrary(DosBase); return(l): 1 Write(file. "0123456789", 10); Close(fıle); CloseLibrary (DosB ase); return(O):

}

Programda, ilk olarak include file'larımızı yazıyoruz.

#include <stdio.h> #include <libraries/dos.h> Burada <stdio.h> içerisinde çokça kullandığımız macrolar ve fonksiyonlar, <libraries/dos.h> içerisinde ise DosBase ve FileHandle yapıları ayrıca dosyalama işlemlerinde kullanılan macrolar tanımlanıyor.

struct DosBase *DosBase; struct FileHandle *file; dos.library rutinlerini kullanmak için, DosBase library pointerini ve dosya pointerini tanımlıyoruz.

DosBase=OpenLibrary("dos.library",0); Bu satırda dos.library'yi açıyoruz ve daha sonra açılıp açılmadığını kontrol ederek eğer açılmadıysa programdan çıkıyoruz. Burada dos.library yerine DOSNAME macrosunu da kullanabilirsiniz. Bu macroların diğerlerini <libraries/dos.h> içerisinde bulabilirsiniz. file=Open("deneme",MODE_NEWFILE);

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