MAK 1005 Bilgisayar Programlamaya Giriş Dosyalar (Binary – İkili- Rastgele Erişimli) Prof. Dr. Necmettin Kaya DOSYALAR C dilinde iki farklı dosyalama şekli mevcuttur: 1. Sıralı (Text) dosyalar 2. Rastgele Erişimli (Binary) dosyalar SIRALI (METİN) DOSYALARI • Metin dosyaları olarak adlandırılan bu dosyalarda kayıtlar arka arkaya yazılır. • Dosyaya yazılan ilk kayıt dosyanın başına, son girilen kayıt ise dosyanın en sonunda bulunur. • Bir kayıta erişmek için o kayıta kadar bütün kayıtların okunması gerekir. RASTGELE ERİŞİMLİ (BINARY) DOSYALAR RASTGELE ERİŞİMLİ (BINARY) DOSYALARI • Özellikle çok fazla sayıda veri ile ilgileniliyorsa, aranan kayıtlara hızlı erişim amacıyla bu tür dosya yapıları kullanılır. • Metin Dosyalarının içeriği ASCII kodları ile oluşturulurken, Rastgele Erişimli Dosyalarda dosya içeriği ikili (binary) kod ile oluşturulur. Text editörlerinde dosya içeriği görüntülenemez. • Rastgele Erişimli Dosyanın içeriği kayıtlardan oluşur ve her kayıt aynı tür ve aynı uzunlukta bilgi içerir. RASTGELE ERİŞİMLİ (BINARY) DOSYALAR • Sıralı dosyalar için geçerli dosya komutları, rastgele erişimli dosyalar için de geçerlidir. • Dosya açış modunda sıralı erişimli dosya açış moduna “b” eklenir: RASTGELE ERİŞİMLİ (BINARY) DOSYALAR • Her bir kayıt sabit genişlikte alt alanlardan oluşur. • Rastgele erişimli dosyalarda her bir kaydın uzunluğu sabit olduğundan, ilgili kaydın konumu bilinmekte ve doğrudan erişim sağlanabilmektedir. Böylece erişim/işleme hızı artmaktadır. • Her bir kayıtta bulunacak bilgi tipleri struct yapısı ile tanımlanır: struct alan_adı { tip1 alt_alan1; tip2 alt_alan2; tip3 alt_alan3; . . . } kayıt_değişkeni; Örnek kayıt yapısı: RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Rastgele erişimli dosyaya veri yazma: fwrite(&kayit_değişkeni,kayit_uzunluğu,sayı,dosya_değişkeni); sayı: diziden diske yazılacak eleman sayısını belirtir . Eğer struct yapısı ile tanımlanmış bir kayıt rastgele erişimli bir dosyaya yazılmak istenirse; ... struct kayit_alani { char ad[20]; char soyad[20]; int Not; } kayit; . . . dosya=fopen("notlar.dat","wb"); . . . fwrite(&kayit,sizeof(kayit),1,dosya); . . . /* kayıt uzunluğu=20+20+4, int hafızada kapladığı alan=4 byte*/ RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Rastgele erişimli dosyadan veri okuma: fread(&kayit_değişkeni,kayit_uzunluğu,sayı,dosya_değişkeni); İstenilen kayda konumlanma: fseek(dosya_değişkeni,kayit_no*kayıt_uzunluğu,KONUM); KONUM seçenekleri: SEEK_SET: dosyanın başı, SEEK_CUR: dosya göstericisinin şu an bulunduğu nokta, SEEK_END: dosyanın sonu. NOT: Kayıt numarası sıfır(0)’dan başlar. Kayıt sayısı: Dosyanın sonuna konumlandıktan sonra: Kayıt_sayısı=ftell(dosya)/kayıt_uzunluğu ftell: dosyanın neresinde bulunduğumuzu verir (bayt). RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Örnek 1: N öğrencinin adı, soyadı ve notunu rastgele erişimli dosyaya kaydeden C programını yazınız. Ekran Çıktısı: #include <stdio.h> #include <conio.h> struct kayit_alani { char ad[20]; char soyad[20]; int Not; } kayit; int N,i; FILE *dosya; main() { dosya=fopen("notlar.dat","wb"); printf("N="); scanf("%d",&N); printf("Kayit uzunlugu=%d\n\n",sizeof(kayit)); for(i=0; i<N; i++) { printf("Ogrenci Adi:");scanf("%s",&kayit.ad); printf("Ogrenci Soyadi:");scanf("%s",&kayit.soyad); printf("Notu:");scanf("%d",&kayit.Not); fwrite(&kayit, sizeof(kayit),1,dosya); } fclose(dosya); printf("Bilgiler dosyaya yazildi"); getch(); } RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Örnek 2: Örnek 1’de oluşturulan rastgele erişimli dosya notlar.dat’ın içeriğini okuyup kayıtları ekrana listeleyiniz. Ekran Çıktısı: #include <stdio.h> #include <conio.h> struct kayit_alani { char ad[20]; char soyad[20]; int Not; } kayit; int i,ks; FILE *dosya; main() { dosya=fopen("notlar.dat","rb"); fseek(dosya,0,SEEK_END); /*Dosyanın sonuna konumlan*/ ks=ftell(dosya)/sizeof(kayit); printf("Kayit sayisi=%d\n\n",ks); for(i=0; i<ks; i++) { fseek(dosya,i*sizeof(kayit),SEEK_SET); fread(&kayit,sizeof(kayit),1,dosya); printf("%s %s %d\n",kayit.ad,kayit.soyad,kayit.Not); } fclose(dosya); printf("Okuma islemi tamamlandi"); getch(); } RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Örnek 3: Örnek 1’de oluşturulan rastgele erişimli dosya notlar.dat’ın içeriğini okuyup istenilen kaydı ekrana yazan C programı. #include <stdio.h> Ekran Çıktısı: #include <conio.h> struct kayit_alani { char ad[20]; char soyad[20]; int Not; } kayit; int KN,ks; FILE *dosya; main() { dosya=fopen("notlar.dat","rb"); fseek(dosya,0,SEEK_END); /*Dosyanın sonuna konumlan*/ ks=ftell(dosya)/sizeof(kayit); printf("Toplam Kayit sayisi=%d\n\n",ks); printf("Gormek istediginiz kayit numarasi="); scanf("%d",&KN); fseek(dosya,(KN-1)*sizeof(kayit),SEEK_SET); fread(&kayit,sizeof(kayit),1,dosya); printf("%s %s %d\n",kayit.ad,kayit.soyad,kayit.Not); fclose(dosya); getch(); } RASTGELE ERİŞİMLİ (BINARY) DOSYALAR Örnek 4: Örnek 1’de oluşturulan rastgele erişimli dosya notlar.dat’ın içeriğini okuyup notu 50’nin üzerinde olan öğrencileri ekrana yazan C programı. #include <stdio.h> Ekran Çıktısı: #include <conio.h> struct kayit_alani { char ad[20]; char soyad[20]; int Not; } kayit; int i,ks; FILE *dosya; main() { dosya=fopen("notlar.dat","rb"); fseek(dosya,0,SEEK_END); /*Dosyanın sonuna konumlan*/ ks=ftell(dosya)/sizeof(kayit); printf("Toplam Kayit sayisi=%d\n\n",ks); printf("Notu 50'nin uzerinde olanlar:\n"); for(i=0; i<ks; i++) { fseek(dosya,i*sizeof(kayit),SEEK_SET); fread(&kayit,sizeof(kayit),1,dosya); if (kayit.Not>50) printf("%s %s %d\n",kayit.ad,kayit.soyad,kayit.Not); } fclose(dosya); getch(); } LABORATUVAR UYGULAMASI UYGULAMA SORULARI (Rastgele erişimli dosyalar) 1. N kişi için ad, soyad ve telefon no alanlarından oluşan kayıtları rastgele erişimli dosyaya yazıp rehber.dat dosyasını oluşturan C programını yazınız. 2. rehber.dat dosyasında ada göre arama yaparak istenilen kişinin telefon numarasını ekrana yazan C programını yazınız. 3. N öğrencinin olduğu bir dersten 2 ara sınav yapılmıştır. notlar.dat adında rastgele erişimli bir dosyanın içine N öğrenci için sıra no, ad, not1 ve not2 kayıtlarını girerek bu kayıtlar içinden; a) not1 ve not2 notlarının sınıf ortalamalarını, b) sınıf ortalamasını, c) sınıf ortalamasının üzerinde not alanların ad, soyad ve not ortalamalarını d) Ortalamaya göre en yüksek not alan öğrencinin sırasını yazan C programını yazınız.
© Copyright 2024 Paperzz