BİLECİK ŞEYH EDEBALİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DOSYA İŞLEMLERİ Programlama dilleri 1-10. hafta - Araş. Gör. Nesibe YALÇIN
Dosya İşlemleri Programın çalışma esnasında her türlü değişken içinde tutulan ve işlenen bilgiler RAM de tutulur. Program sona erdiğinde RAM de kullanılan alan boşaltılır. Bazı verilerin saklanmasına gerek duyulur. Programda bir dosya, FILE türünde bir pointer/gösterici ile bildirilir. FILE * dosya_gostericisi; FILE sözcüğü, stdio.h içerisinde bildirilmiş bir yapıdır. 2
Metin Dosyaları ve Binary Dosyalar Metin dosyaları, sıralı ve satırlar halinde metin bilgilerinden oluşmaktadır. Her satırda toplam 255 karakter bulunur. Her satırda 0 veya daha fazla karakter içerir. Kod içinde satır sonlarına \n yeni satır (new line) konulur, fakat program dosyaya kayıt yaparken satır sonuna CR-LF (CarriageReturn LineFeed, Shift+Enter) işareti koyar. Bu işarete, satır sonu (end of line) işareti denir. 3
Metin Dosyaları ve Binary Dosyalar Veri okunurken ise satır sonu işareti programa \n yeni satır karakteri olarak çevrilir. Binary (ikili) dosyalarda veriler bellekteki gösterim biçimleriyle saklanırlar. Bütün veriler byte byte ardışık olarak dosyaya yazılır. Her iki dosya çeşidinde de dosya sonunu gösteren işaret EOF (end of file) vardır. 4
Bir dosyaya okuma/yazma yapmak için ilk olarak dosyanın açılması gerekir. Dosya açmak için fopen() fonksiyonu kullanılır. FILE * dosya; // dosya göstericisi dosya=fopen("dosya_adı","dosyanın_modu"); Hangi dosyanın açılacağını ve dosyanın ne amaçla açıldığını belirtiyoruz. FILE *fp = fopen("deneme.dat","r"); FILE *fptr = fopen("sayilar.bin", "rb"); 5
Dosya Açma Modları Açılış modunda metin dosyaları için t, ikili dosyalar için b eklenir. Bu belirleme yapılmamışsa, varsayılan açılış modu metindir (yani t). r: Dosyayı sadece okumak için açar (read only). Bu şekilde açılacak metin dosyası mutlaka sistem üzerinde bulunmalıdır aksi halde hata oluşur. rt : Okuma için bir metin dosyası açar. rb : Okuma için bir dosyayı ikili sistemde açar. 6
Dosya Açma Modları w: Dosyayı sadece yazmak için açar (write only). Eğer açılması istenen metin dosyası sistem üzerinde yok ise oluşturulacaktır. Eğer var ise dosya silinerek yerine yenisi konulacaktır!!! wt : Metin dosyasını yazma için açar/oluşturur. wb : Yazma için ikili sistemde bir dosya açar/oluşturur. a: Dosyanın sonuna ekleme yapmak için açar (append). Dosya yoksa yeni oluşturulacak, var ise öncekinin sonundan yazmak üzere hazır hale gelecektir. at : Metin dosyasının sonuna ekleme yapar. ab : İkili sistemde bir dosyaya ekleme yapar. 7
Dosya Açma Modları r+ : Okuma/yazma için bir metin dosyası açar. (r+t) w+ : Okuma/yazma için bir metin dosyası açar. (w+t) a+ : Okuma/yazma için bir metin dosyası açar. (a+t) r+b w+b a+b : Okuma ve yazma için bir ikili sistem dosyası açar. : Okuma ve yazma için bir ikili sistem dosyası oluşturur. : Okuma ve yazma için bir ikili sistem dosyasına ekleme yapar. rb+, wb+, ab+, rt+, wt+, at+ şeklinde açma modların da vardır. 8
Açılan dosya fclose() ile tekrar kapatılmalıdır. Genel olarak:... FILE *dosya;... dosya = fopen( dosya_adı, mod );... fclose(dosya);... 9
Dosyanın açılıp açılmadığını kontrol etmek için; FILE *dizin; dizin= fopen("deneme.dat", "w"); if( dizin == NULL ) { printf("dosya acilmiyor..."); exit(1); }... // dosya açılırsa yapılacak işlemler... fclose(dizin); 10
fprintf(); Dosyaya formatlı veri yazar. FILE *fp=fopen("deneme.txt","w"); int a=2,b=3; fprintf(fp,"%d, %d",a,b); fclose(fp); fputs(); Dosyaya string yazar. FILE *fp=fopen("deneme.txt","a"); char *kelime="bilecik"; fputs(kelime, fp); fputs("\n merhaba", fp); fclose(fp); 11
#include <stdio.h> #include <conio.h> #include <stdlib.h> void main() { float x,y,z,hacim; FILE * fp = fopen("d:\\hacim.txt","w+"); if( fp== NULL) { puts("dosya acilamiyor."); exit(1); } printf("odanin boyutlarini girin : "); scanf("%f %f %f",&x,&y,&z); hacim=x*y*z; \ yerine \\ kullanılır. fprintf(fp, "Hacim:\n %.2f * %.2f * %.2f= %.2f",x,y,z,hacim); fclose(fp); puts("bilgiler kaydedildi."); getch(); } 12
fputc(); Dosyaya karakter yazar. FILE *fp=fopen("deneme.txt","w"); char x='&'; fputc(x,fp); fclose(fp); fgetc(); Dosyadan karakter okur. FILE *fp=fopen("deneme.txt","r"); char x=fgetc(fp); fclose(fp); printf("%c",x); 13
fscanf(); Dosyadan formatlı veri okur. D:\Prog.Dil.1\notlar.txt 14
#include <stdio.h> #include <conio.h> #include <stdlib.h> void main() { FILE *oku=fopen("d:\\prog.dil.1\\notlar.txt","r"); if(oku==null) { printf("dosya acilamadi..."); getch(); exit(1); } char sube,ad [10],soyad[20]; float boy,kilo; fscanf(oku,"%c %s %s %f %f\n",&sube,ad,soyad,&boy,&kilo); printf("%c %s %s %f %f\n",sube,ad,soyad,boy,kilo); fscanf(oku,"%c %s %s %f %f",&sube,ad,soyad,&boy,&kilo); printf("%c %s %s %f %f",sube,ad,soyad,boy,kilo); fclose(oku); getch(); } 15
fgets(); Dosyadan string/karakter dizisi okur. 16
#include <stdio.h> #include <conio.h> void main() { FILE *fptr=fopen("sehirler.txt","r"); char sehir[20]; fgets(sehir,20,fptr); printf("%s",sehir); fgets(sehir,20,fptr); printf("%s",sehir); fgets(sehir,20,fptr); printf("%s",sehir); fclose(fptr); getch(); } 17
feof(); Dosyanın sonuna gelinip gelinmediğini gösterir. Eğer dosyanın sonuna gelindiyse true değerini döndürür. Fonksiyon false ise dosyanın sonuna gelinmemiş demektir. void main() { FILE *fptr; char sehir[20]; if((fptr=fopen("sehirler.txt", "r"))==null){ printf("okuma icin acilamadi..."); exit(1); } while(!feof(fptr)) { fgets(sehir,20,fptr); printf("%s",sehir); } fclose(fptr); getch(); } 18
EOF; End Of File (dosya sonu) anlamındadır. #include <stdio.h> #include <conio.h> #include <stdlib.h> void main(){ FILE *fptr; char ch='x'; if((fptr=fopen("sehirler.txt", "r"))==null) { printf("okuma icin acilamadi..."); exit(1); } while(ch!=eof) { ch=fgetc(fptr); printf("%c",ch); } fclose(fptr); getch(); } 19
Uygulamalar C sürücüsünde projeler klasöründe uygulama alt klasöründeki veri.dat isimli dosyayı sadece okuma modu ile açan deyimi yazınız. Klavyeden girilen bir kelime içindeki harfleri alt alta bir dosyaya yazan programı yazınız. fclose(fp); fputc(fp, *a); fputs(fptr, b); c=fgetc(); fgets(d, 10, fptr); Hatalı olan satırları bulup düzeltiniz. 20
Uygulamalar «ogrenci.txt» adlı dosyada öğrencilere ilişkin numara, ad, soyad, vize, final ve ortalama not bilgileri tutulmaktadır. Kullanıcı tarafından girilen öğrenci numarasına göre dosyada arama yaparak ilgili öğrenciye ait bilgileri ekrana yazan programı yazınız. 21
Uygulamalar «sayilar1.txt» içerisinde 10 adet, «sayilar2.txt» içerisinde ise 5 adet küçükten büyüğe sayılar bulunmaktadır. Bu iki dosya içindeki sayıları sıralı bir şekilde «sayilar.txt» adlı tek bir dosyaya yazan programı yazınız. 22