26 Aralık 2013 Perşembe

Disk Dosyaları (Dosyalama) - Ders12

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 basar
1: /* 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