BİLGİSAYAR PROGRAMLAMA Ders 10: Dosyalama İşlemleri
Dosya Programda kullanılacak verileri veya programda üretilen verileri saklamak için dosyalar kullanılır. Programlama dilleri dosya yaratma, dosya silme, dosyadan bilgi okuma ve dosyaya bilgi ekleme gibi temel işlevler için gerekli komutları içerirler. Dosyalar saklama türüne göre ve kayıt erişim biçimlerine göre aşağıdaki gibi sınıflandırılırlar: Saklama türleri: ikili (binary) ve metin (text) Kayıt erişim biçimleri: sıralı (sequential) ve rastgele (random)
Saklama Türüne Göre Dosyalar Metin (text) türündeki dosyalara bilgi ASCII biçiminde kaydedilir. Bu tip dosyalar Not Defteri (Notepad) gibi bir metin editörleri tarafından okunabilir. İkili (binary) türündeki dosyalara sayısal veriler ASCII formatına dönüştürülmeden doğrudan kaydedilir. Örn: 123 sayısı metin türü dosyaya 00110001, 00110010, 00110011 (49, 50, 51) şeklinde 3 byte olarak kaydedilirken, ikili dosyaya 01111011 şeklinde 1 byte olarak kaydedilir.
Erişim Biçimlerine Göre Dosyalar Sıralı Erişimli (Sequential Access) dosyalarda, kayıtların boyutu sabit değildir. Bu nedenle aradığımız kayda erişmek için tüm kayıtlara tek tek bakmamız gerekir. Rastgele Erişimli (Random Access) dosyalarda, her kayıt sabit bir uzunlukta olmalıdır (Örneğin soyad alanı kayıt deseninde 20 karakter olarak belirlendiyse, o uzunlukta soyad girilmediğinde kalan kısımlar boşluk karakteri ile doldurulur). Bu sayede n. kayda erişmek gerektiğinde, önceki kayıtları atlamak için; (n 1) × Kayıt Boyu kadar dosyada ilerleme seçeneği kullanılabilir.
Dosyalama Komutları C dilinde öncelikle FILE * türünde bir dosya değişkeni yaratılmalıdır. Dosya kullanılmadan önce fopen komutu ile açılır ve yazma/okuma işlemleri bittikten sonra fclose komutu ile kapatılır. Dosyaya veri yazmak için fprintf, fputs, fputc ve fwrite komutları, dosyadan bilgi okumak için fscanf, fgets, fgetc ve fread komutları kullanılır. Not: Başka dosyalama komutları da var ama en çok kullanılanlar bu komutlar olduğu için bunları bilmeniz yeterlidir.
Dosyaya "Merhaba Dünya" yazdıran ve takrar açıp okuyan program #include <stdio.h> void main(){ FILE *yaz; char str[100]; yaz = fopen("dosyam.txt", "w"); fprintf(yaz, "Merhaba millet"); fclose(yaz); yaz = fopen("dosyam.txt", "r"); fscanf(yaz, "%s", &str); printf("%s", str); } dosyam.txt dosyası yazma (w) kipinde açılır. fopen fonksiyonunun döndüreceği değer dosya verilerinin saklanacağı yerin başlangıç adresidir. Bu değer önceden tanımladığımız dosya değişkenine atanır. fputs("Merhaba Dunya", yaz); fgets(str, 12, yaz); Kipler: “w” write (yazma), “r” read (okuma), “a” append (ekleme), “w+”, “r+” ve “a+” hem okuma hem yazma, “b” binary (ikili, diğerleri ile birlikte kullanılır: “w+b” gibi)
fprintf ve fscanf fprintf(dosya, format string, [değişkenler]); fscanf(dosya, format string, [değişkenler]); Aldıkları ilk parametre olan dosya parametresi dışında kullanımları printf ve scanf ile aynıdır. fprintf ekran yerine dosyaya yazarken, fscanf klavye yerine dosyadan okur. NOT: Burada ve sonraki slaytlarımızda dosya adında verilen parametreler FILE * türünde olan dosya değişkenini ifade etmektedir.
fgets ve fputs fgets dosyadan bir string okur fgets(string, boyut, dosya); fputs dosyaya bir string yazar fputs(string, dosya); fgets içindeki 2. parametre (boyut) yazılacak olan string'in karakter sayısından az verildiyse, o string'in ilk boyut kadar karakteri yazılır. Çok verildiyse string'in tamamı yazılır.
1 ile 10 arasındaki sayıların karesini dosyaya ekleyen program #include <stdio.h> void main(){ FILE *dosya; int i; dosya = fopen("dosya.txt", "w"); for (i=1; i<=10; i++) fprintf(dosya, "%d\n", i*i); fclose(dosya); }
fgetc ve fputc fgetc dosyadan bir karakter okur karakter = fgetc(dosya); fputc dosyaya bir karakter yazar fputc(karakter, dosya); Dosya kopyalama işleminde dosya1 de bulunan karakteri dosya2’ye yazarken aşağıdaki gibi bir kullanım uygulayabilirsiniz: fputc(fgetc(dosya1), dosya2);
Dosyadaki tüm verileri okuyarak ekrana yazdıran program #include <stdio.h> void main(){ FILE *d; d = fopen("metin.txt", "r"); while (!feof(d)) printf("%c", fgetc(d)); fclose(d); getchar(); } “metin.txt” isimli dosya okuma kipinde açılarak içindeki bilgiler karakter karakter okunuyor ve ekrana yazdırılıyor. feof fonksiyonu dosya sonuna gelinince true (1) değerini döndürür.
Dosyadaki verileri başka bir dosyaya kopyalayan program #include <stdio.h> void main(){ FILE *d1, *d2; char chr; d1 = fopen("metin.txt", "r"); d2 = fopen("metin_kopya.txt", "w"); while (1) { chr = fgetc(d1); if (feof(d1)) break; fputc(chr, d2); } fclose(d1); fclose(d2); while (!feof(d1)) fputc(fgetc(d1), d2); Programımızdaki while döngüsünü yukarıdaki gibi değiştirirsek, d2'ye eof karakterini de yazar. Yani d2 dosyası, d1 dosyasından 1 byte fazla olur.
Klavyeden girilenleri alarak dosyaya ekleyen program #include <stdio.h> #include <string.h> void main(){ FILE *d; char str[100]; d = fopen("yazi.txt", "w"); do { gets(str); fprintf(d, "%s\n", str); } while (strlen(str)); fclose(d); } Bir satır boş bırakılana kadar girilen tüm satırları dosyaya yazar scanf kullanımı boşluk karakterinde sorun çıkardığı için gets kullandık str = "" olduğunda strlen sıfır döndürür. while(0) döngüden çıkış anlamına gelir.
Notlar fopen komutu dosyayı bulamaz yada açamazsa NULL değer döndürür : FILE *d; if ((d=fopen("dosya.txt", "w"))==NULL) printf("Dosya acilamadi\n"); Dosyanın İsmini Değiştirme : rename("eski.txt", "yeni.txt"); Dosyayı Silme : remove("deneme.txt");
Ödev 2 Kullanıcının ekleyeceği notları notlar.txt dosyasında sıra ile saklayan bir program yazın. Program çalıştırıldığında dosyanın içinde saklı olan tüm notlar sıra numarası ile birlikte görüntülenecek ve altında "not eklemek için 1’e, not silmek için 2’ye çıkış için ESC’ye basın" mesajı görüntülenecektir. Not Ekleme seçildiğinde "Notunuzu Giriniz" mesajı görüntülenecek ve kullanıcının ekrana yazacağı not ENTER basıldığı anda dosyanın sonuna eklenecektir. Not Silme seçildiğinde "Silmek İstediğiniz Notun Numarasını Giriniz" mesajı görüntülenecek ve kullanıcının seçtiği not dosyadan silinecektir. Ekleme ve silme işlemlerinden sonra ekran temizlenip programın başına dönülmelidir (Dosyanın son hali ekranda gösterilip yine altında "not eklemek için 1’e, not silmek için 2’ye çıkış için ESC’ye basın" mesajı görüntülenmelidir).