Eln 1002 Bilgisayar Programlama II C»de Dosya ğşleme : S¹ral¹ EriŞim Ne ÖĆreneceĆiz? Dosyalar ve Streamler Sequential (sıralı) erişim dosyaların yaratılması Sıralı Erişim Dosyalarından Veri Okuma Sıralı Erişim Dosyalarına Veri Yazma Uygulamalar
Dosyalar ve Stream»ler Bilgisayar programları disk üzerindeki dosyaları okuyabilir ve bunlara yazabilir. Dosya sistem detayları geniş bir spektrumda değişim gösterir. Her iletişim sistemi birbirinden farklı sistemler kullanır : Unix, Linux, IRIX, HP-UX, MS-DOS, Win16, Win32, NTFS, AppleOS, MacOs, Solaris... Dosyaların iki formatı mevcuttur: Karakter dosyaları : Byte dizisi olarak klavye karakter dizileri dosyada saklanır. ASCII UniCode Binary dosyalar : Bir ve sıfırların dizisi saklanır. Özellikle sayıların saklanacağı dosyalarda kullanılır. Örnek : 49 binary dosyada 11001, fakat karakter dosyasında 4 ve 9 dur. Dosyalar ve Stream»ler Dosyadan bilgi elde edeceğimiz zaman dosyadan okuruz. Dosyada bilgi saklayacağımız zaman dosyaya yazarız. Ama herşeyden önce dosyayı açmak zorundayız. Yani önce dosya açılır. İşlemler gerçekleştirilir. Ve en son dosya kapanır. Dosyalar iki yol ile okunur/yazılır: Sıralı Erişim : Baştan sona doğru dosya okunur (veya dosyaya yazılır). Random Erişim : Dosya içinde herhangi bir yere yazılır veya herhangi bir yerden okunur. Veri tabanı uygulamaları için uygundur. C her dosyayı byte ların bir dizisi olarak görür : Dosya end-of-file (EOF) işaretcisi ile sona erer. Veya özel bir karakter ile sona erer. Dosya açıldığında stream yaratılır. Program ile dosya arasında haberleşme kanalı olarak iş görür. Özel yapıya sahiptirler (FILE yapısı). Örnek : stdin, stdout, stderr
S¹ral¹ EriŞim Dosya Yarat¹lmas¹ HER ZAMAN kullanmadan önce dosyayı AÇ. HER ZAMAN işin bittikten sonra dosyayı KAPAT. Dosya açma işlemi üç aşamada gerçekleşir. Dosya işaretçisini tanımla. fopen() fonksiyonunu kullanarak dosyanın açılması/yaratılması Hata kontrolü Dosya adı Dosya modu S¹ral¹ EriŞim Dosya Yarat¹lmas¹ Programlar bir veya daha fazla sayıda dosyayı işleyebilirler. Açılan her dosya farklı isme sahip olmalıdır ve her FILE pointer için farklı değer oluşturulur. Dosya programın çalıştığı klasör içine açılır veya içinde olmalıdır. Farklı bir klasör içine açılıyorsa veya farklı bir klasör içindeyse dosya isminden önce bulunduğu klasörün yolu girilmelidir. C:\\win\\system.ini /usr/etc/passwd MS-Windows için Unix için NOT : Dosya pointerları üzerinde pointer aritmetiği geçerli değildir. fopen() hafızadan yer tahsis eder. fclose() unutulursa bu hafıza kaybıdır.
Dosya Modlar¹ Mod Görev Dosya Mevcutsa Dosya Mevcut Değilse r Dosyayı sadece okumak için açar Dosya açılır ve okunabilir. Dosyaya veri yazılamaz. İşlem başarısız olur. w Yeni dosya kaydeder. Dosya içeriği silinir ve yeni içerik kaydedilir. Yeni dosya yaratılır ve yazma işlemi yapılabilir. a Mevcut dosyayı açar, yeni dosya kaydeder, düzenlenmiş dosyayı kaydeder. Dosya açılır ve düzenlenir veya değiştirilir. Yeni bilgi dosya sonuna eklenir. Yeni dosya yaratılır ve yazma işlemi için hazır hale getirilir. r+ Mevcut dosyayı açar. Dosya açılır ve mevcut veri değiştirilir, yenilenir. İşlem başarısız olur. w+ Yeni dosya yaratır veya mevcut olanı açar. Dosya açılır. İçeriği silinir ve yeni içerik yazılır. Yeni dosya yaratılır ve yazma işlemi yapılabilir. a+ Yeni dosya yaratır veya mevcut olanı açar. Dosya açılır, içerik değiştirilebilir. Yeni bilgi dosyanın sonuna eklenir. Yeni dosya yaratılır ve yazma işlemi yapılabilir. rb, wb, ab, rb+, wb+, ab+ : Yukarıdakiler ile aynı işleve sahiptirler. Sadece binary modda işlem yaparlar. S¹ral¹ EriŞim Dosyaya Yazmak/Dosyadan Okumak Sıralı dosyalara veri yazmak için fprintf() fonksiyonu kullanılır. fprintf() kuralları, printf() ile aynıdır. Farklı olarak fprintf() fonksiyonuna dosya pointer ı parametre olarak geçirilir. Sıralı dosyadan veri okumak için fscanf() fonksiyonu kullanılır. Kullanım açısından fscanf(), scanf() fonksiyonu ile aynı kurallara sahiptir.farklı olarak fscanf() fonksiyonuna okuma yapılacak dosya işaretcisi parametre olarak geçirilir. fscanf() de dosyada boşluk ile karşılaşıncaya kadar okuma yapar. Yani sadece kelime okuyabiliriz.
S¹ral¹ EriŞim Dosyaya Yazmak /* Konu : C'de Dosyalar Orn : Sirali dosyaya yazmak */ #include<stdio.h> int main() int studentid; char studentname[30]; float GANO; FILE *sfile; sfile = fopen("students.txt", "w"); if(sfile == NULL) printf("dosya acilamadi...\n"); return 1; do printf("ogrenci Numarasini Giriniz : "); scanf("%d", &studentid); printf("ogrenci Adini Giriniz : "); scanf("%s", studentname); printf("ogrenci GANO Giriniz : "); scanf("%f", &GANO); fprintf(sfile, "%d\t%s\t%f\n", studentid, studentname, GANO); while(!feof(stdin)); fclose(sfile); S¹ral¹ EriŞim Dosyaya Yazmak Komut Satırı : Çıktı students.txt Dosyası : İki kez yazıldığına dikkat ediniz.
S¹ral¹ EriŞim Dosyaya Yazmak /* Konu : C'de Dosyalar Orn : Sirali dosyaya yazmak */ #include<stdio.h> int main() int studentid; char studentname[30]; float GANO; int devam; FILE *sfile; sfile = fopen("students.txt", "w"); if(sfile == NULL) printf("dosya acilamadi...\n"); return 1; do printf("ogrenci Numarasini Giriniz : "); scanf("%d", &studentid); printf("ogrenci Adini Giriniz : "); scanf("%s", studentname); printf("ogrenci GANO Giriniz : "); scanf("%f", &GANO); fprintf(sfile, "%d\t%s\t%f\n", studentid, studentname, GANO); printf("devam Etmek Istiyor musunuz? (1:Devam/0:Bitti) : "); scanf("%d", &devam); while(devam==1); fclose(sfile); S¹ral¹ EriŞim Dosyaya Yazmak Komut Satırı : Çıktı students.txt Dosyası :
S¹ral¹ EriŞim Dosyadan Okumak /* Konu : C'de Dosyalar Orn : Sirali dosyadan okumak */ #include<stdio.h> Komut Satırı : int main() int studentid; char studentname[30]; float GANO; FILE *sfile; sfile = fopen("students.txt", "r"); if(sfile == NULL) printf("dosya acilamadi...\n"); return 1; printf("numara\tisim\tgano\n"); printf("----------------------------\n"); while(!feof(sfile)) fscanf(sfile, "%d\t%s\t%f\n", &studentid, studentname, &GANO); printf("%d\t%s\t%.2f\n", studentid, studentname, GANO); fclose(sfile); S¹ral¹ EriŞim Dosyaya Yazmak/Dosyadan Okumak Önceki programda, okuma işlemi bittikten sonra, fclose() fonksiyonundan önce tekrar okuma yapmaya çalışsak ne ile karşılaşırız? Cevap : Hiç birşey okuyamayız. Dosyamızın içinde sanal bir imleç olduğunu varsayarsak, bu imleç ilk okumayla dosya sonuna gelmiştir ve tekrar okumaya kalkarsak imleç sonda olduğundan hiç birşey okuyamayız. Okuma işlemi bittikten sonra dosyadan tekrar okuma yapmak istiyorsak dosya imlecini dosyanın başına almalıyız. rewind() fonksiyonu dosya imlecini dosyanın başına getirir. Kullanımı : rewind(file *stream);
S¹ral¹ EriŞim Dosyaya Yazmak/Dosyadan Okumak fprintf() ve fscanf() fonksiyonları dışında sıralı dosyadan yazma ve okuma yapan fonksiyonlar mevcuttur. Karakter yazma ve okuma : fputc() ve fgetc() fonksiyonları. int fputc(int c, FILE *stream); int fgetc(file *stream); Dosyadaki bir satırı veya belli bir uzunluğu okuma : fgets() char *fgets(char *str, int n, FILE *stream); Dosyaya string yazma : fputs() int fputs(const char *str, FILE *stream); Uygulama : Dosyada Kay¹tl¹ Kelimeleri Sayma Problem : Dosyada kayıtlı text içinde kaç kelime olduğunu sayan bir program yazmak. Algoritma: Dosya adını kullanıcıya sor. Dosyayı aç. Dosyanın açıldığını kontrol et. Dosyadaki kelimeleri say. Sonucu ekrana yaz. Dosyayı kapart. Kelimeleri sayan fonksiyon : fscanf() in boşluğa kadar okuma özelliği kullanılacaktır. sayacı sıfırla döngü dosyadan kelime oku eğer okuma işlemi başarısız olduysa döngüden çık sayacın değerini 1 arttır.
Uygulama /* Konu : C'de Dosyalar Orn : Dosyadaki Text icinde kac kelime oldugunun sayilmasi. */ #include<stdio.h> /*Fonksiyon prototipleri*/ int kelimesay(file *); /*main fonk.*/ int main() char dosyaadi[30]; /*Fonksiyon tanimlari*/ int kelimesay(file *text) int sayac = 0; char kelime[40]; while(fscanf(text, "%s", kelime)!=eof) sayac++; return sayac; printf("dosya Adini uzantisiyla birlikte giriniz :"); scanf("%s", dosyaadi); /*Dosya Acilmasi*/ FILE *textdosya; textdosya = fopen(dosyaadi, "r"); if(textdosya==null) printf("dosya Acilamadi..."); return 1; int kelimesayisi = kelimesay(textdosya); printf("%s Dosyasinda %d adet kelime vardir...", dosyaadi, kelimesayisi); return 0; Uygulama Kelimeleri sayılacak dosya içeriği : Program çıktısı :