FİHRİST - İzmir Adliyesi

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.