Ders12: Disk Dosyaları (Dosyalama)
Çoğu programda, bazı verilerin disk üzerinde saklanmasına gerek duyulur.
C programlama dilinde, disk dosyasına erişme (okuma ve yazma için)
iki farklı yöntemle yapılır. Bunlar üst düzey ve alt düzey olarak adlandırılır.
Bunlardan üst düzey G/Ç yöntemi ANSI tarafından desteklenmektedir.
Alt düzey G/Ç ANSI tarafından desteklenmemektedir.
Bu yüzden, burada Üst düzey G/Ç konu edilecektir.
Dosya Açma ve Kapama
Bir dosyaya okuma/yazma yapmak için onun açılması gerekir.
Bunun için fopen() fonksiyonu kullanılır. Açılan dosya fclose()
ile tekrar kapatılmalıdır. Genel olarak:
... FILE *dosya; ... dosya = fopen(dosya_adı,mod); ... fclose(dosya); ...
mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:
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.
deneme.txt adlı bir dosyanın, yazmak için açılıp açılmadığını test etmek
için aşağıdaki kod kullanılır:
#include <stdio.h> ... FILE *yaz; /* dosya işaretçisi */ ... yaz = fopen("deneme.txt","w"); if( yaz == NULL) { puts("bu dosya acilmiyor..."); exit(); } /* açılırsa! dosya işlemleri */ ... fclose(yaz); ...Dosya Fonksiyonları
Fonksiyon Görevi fopen() Dosya oluşturur, açar fclose() Dosyayı kapatır putc() Dosyaya karakter yazar getc() Dosyadan karakter okur feof() Dosya sonuna gelindiğini sorgular fprintf() Dosyaya formatlı veri yazar fscanf() Dosyadan formatlı veri okur fputs() Dosyaya katar yazar fgets() Dosyadan katar okur fwrite() Dosyaya dizi yazar fread() Dosyadan dizi okurÖrnekler
Program 12.1 : Bu program klavyeden girilen iki tamsayı ve toplamını deneme.txt adlı bir dosyaya yazar.
1:/* dosya1.c */ 2: #include <stdio.h> 3: 4: main() 5: { 6: FILE *yaz; 7: int x,y,z; 8: 9: yaz = fopen("deneme.txt","w"); 10: if( yaz== NULL) 11: { 12: puts("Dosya acilamiyor...\a\n"); 13: exit(); 14: } 15: 16: printf("Toplanacak iki sayı girin : "); 17: scanf("%d %d",&x,&y); 18: z = x+y; 19: 20: fputs( "Bu dosya iki sayının toplamsını gösterir!\n",yaz ); 21: fprintf(yaz,"%d + %d = %d",x,y,z); 22: fclose(yaz); 23: 24: puts("Bilgiler kaydedildi. Devam etmek için ENTER tuşuna basın."); 25: getchar(); 26: } Toplanacak iki sayı girin : 5 6 Bilgiler kaydedildi. Devam etmek için ENTER tuşuna basın. +----------------------------------------------- | Bu dosya iki sayının toplamsını gösterir! | 5 + 6 = 11 |
Not: deneme.txt dosyası daha önce oluşturulmuşsa Program 12.1
önceki verileri silip yerine yeni verileri yazacaktır.
Ekleme yapmak için fopen() fonksiyonunu 'a' modu ile kullanılmalıdır.
Bilgisayarın c:\deneme dizininde bulunan tipler.dat adlı bir dosyaya sahip
olduğumuzu varsayalım, ve bu dosyanın içeriği aşağıdaki gibi olsun.
+------------------------------- |Ahmet |d |1256 |65489878 |0.822 |
Buradaki veri tipleri sırasıyla katar, karakter, tamsayı, uzun tamsayı ve reel
sayı şeklindedir. dosya2.c programı bu verilerin nasıl okunacağını göstermektedir.
Program 12.2 : Bu program bir dosyaya formatlı yazılmış olan verileri okur ve ekrana basar1: /* dosya2.c */ 2: #include <stdio.h> 3: main() 4: { 5: FILE *oku; 6: char ktr[10],kr; 7: int tam; 8: long uzun_tam; 9: float reel; 10: 11: if( (oku=fopen("c:\\deneme\\tipler.dat","r")==NULL ){ 12: puts("Dosya açılmadı !\n"); 13: exit(); 14: } 15: 16: fscanf(oku,"%s\n%c\n%d\n%ld\n\%f", 17: ktr,&kr,&tam,&uzun_tam,&reel); 18: fclose(oku); 19: 20: puts("Dosyadan okunan veriler sırasıyla:"); 21: printf(%s\n%c\n%d\n%ld\n\%f",ktr,kr,tam,uzun_tam,reel); 22: 23: } Dosyadan okunan veriler sırasıyla: Ahmet d 1256 65489878 0.822
Elimizde aşağıdaki gibi bir dosya olsun. Bu dosyadan istediğimiz bir
öğrencinin numarasını girerek ona ait bilgilere ulaşılmak istensin.
Program 12.3 basit bir veritabanı uygulamasıdır.
Bu program öğrencilere ait bilgilerin bulunduğu bir
dosyadan veri okur. 16. satırda Öğrencinin numarası istenir.
Eğer böyle bir numara varsa öğrenciye ait bilgiler ekrana
basılır. Aksi durumda "Kayıt bulunamadı" şelinde bir ileti
ekrana basılır.
+------------------------------------------------ |NO ADI SOYADI mt1 mt2 fin |--- ------- ------ --- --- --- |251 Ahmet Bingul 100 100 100 |597 Meltem Bingul 100 100 100 |569 Metin Celen 54 65 89 |987 Teoman Burak 45 87 65 |Program 12.3 : Basit bir veritabanı
1: /* dosya3.c */ 2: #include <stdio.h> 3: 4: main() 5: { 6: FILE *notlar; 7: int i,numara,no,mt1,mt2,final; 8: char gecici[10],ad[10],soyad[10]; 9: 10: if( (notlar=fopen("notlar.js","r")==NULL ){ 11: puts("Dosya açılmadı !\n"); 12: exit(0); 13: } 14: 15: printf("Numara girin: "); 16: scanf("%d",&numara); 17:
18: for(i=0;i<12;i++) 18: fscanf(notlar,"%s",gecici); 19: 20: no = 0; 21: 22: while( !feof(notlar) ) 23: { 24: fscanf(notlar,"%d\t%s\t%s\%d\t%d\t%d\n", 25: &no,ad,soyad,&mt1,&mt2,&final); 26: if( no==numara ) break; 27: } 28: fclose(oku); 29: if( no ){ 30: puts("Öğrenci Bilgileri:"); 31: printf("Numarası : %d",no); 32: printf("Adı : %s",ad); 33: printf("Soyadı : %d",soyad); 34: printf("1.Vize : %d",mt1); 35: printf("2.Vize : %d",mt2); 36: printf("2.Vize : %d",mt3); 37: } 38: else 39: puts("Kayıt bulunamadı"); 40: 41: }/*main*/Bazı uygulamalarda, daha önce bir şekilde hazırlanmış olan bir dosyanın içeriğini değiştirmek gerekebilir. Program 12.4 , eski.dat dosyasındaki verileri yeni.dat dosyasına aşağıdaki çevirir. Program kodları bir dosyadan diger bir dosyaya, bir verinin nasıl taşınacağına dair bir örnek teşkil eder.
dosya 1 dosya 2 _______________ ________________ |X-degerleri | | | |1.0 | |X Y | |2.0 | |1.0 0.0 | |3.0 | |2.0 2.5 | |4.0 | |3.0 4.9 | |5.0 | ---> |4.0 3.2 | |Y-degerleri | |5.0 1.8 | |0.0 | | | |2.5 | | | |4.9 | | | |3.2 | | | |1.8 | | | |_______________| |________________|Program 12.4 : dosya1 in içindeki alt alta olarak yazılmış olan verileri, dosya2 ye şekildeki gibi yan yana yazar
1: /* dosya4.c */ 2: #include <stdio.h> 3: 4: main() 5: { 6: FILE *oku,*yaz; 7: float x[5],y[5]; 8: char dosya1[12],dosya2[12],gecici[10]; 9: int i; 10: 11: printf("Verilerin okunacağı dosyanın adı"); 12: scanf("%s",dosya1); 13: if( (oku==fopen(dosya1,"r"))==NULL ){ 14: printf("%s dosyası acilamiyor...",dosya1); 15: exit(); 16: } 17: 18: printf("Verilerin yazılacağı dosyanın adı"); 19: scanf("%s",dosya2); 20: if( (yaz==fopen(dosya1,"w"))==NULL ){ 21: printf("%s dosyası acilamiyor...",dosya2); 22: exit(); 23: } 24: 25: /*dosya1 den verileri oku, bu verileri x[] ve y[] dizilerine sakla */ 26: fscanf(oku,"%s",gecici); /* rakamlarin disindaki degerleri okumak icin */ 27: for(i=0;i
Hiç yorum yok:
Yorum Gönder