Dosya İşlemleri Nedir? Programlarınızı girdi (input) olarak aldığı verileri bir text dosyasında yada word dosyasında vb. saklamasıdır. Artık C programınızın yaratıp içine veriler koyacağı text dosyasını sabit diskiniz yani hard diskinizde saklayıp istediginiz zaman açıp istediğiniz zaman tekrar kullanabileceksiniz. Dosyalara Veri Yazmak 1-) Dosyayı Açmak 2-) Dosyaya Veriler Eklemek 3-) Dosyayı Kapatmak 1) Dosyaların Açılması fopen( ) Fonksiyonu C dilinde dosyalar FILE sözcüğü ile tanımlanmakta olup, aslında FILE yapısal bir veri tipidir. Diğer bir deyişle, stdio.h başlık dosyası içinde tanımlanmış bir yapıdır. Bu yapı Typedef struct short level; unsigned flags, char fd; unsigned char hold; short bsize, unsigned char *buffer, unsigned cahr *curp; unsigned istemp, short token; FILE; şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2; şeklinde tanımlayabiliriz. FILE *DosyaOku; gibi bir ifade kullandığımızda, DosyaOku diye bir dosyamızın olacağını ve FILE tipinde bi işaretçi döndürmüş olduğumuzu biliyoruz. int main() FILE *DosyaOku; DosyaOku = fopen("adiniz.txt","w"); NOT : Eger write komutunu kullanarak bir dosyaya C ile yazı yazdırırsanız her yeni birşey yazdırdıgınızda üzerine yazacaktır, yani eski dosyanızın içerigi sürekli degişecektir ama append komutunu kullanırsanız altına yazacaktır.
Mod İşlevi r w a var olan bir dosyayı sadece okumak amacı ile açar. bir dosyayı bilgi yazmak için açar. Dosya daha önceden var ise içindeki bilgiler silinerek dosya başından yazmaya başlanır. var olan bir dosyanın sonuna bilgi eklemek için kullanılır. Eğer dosya yok ise yeni bir dosya açılır. r+ var olan bir dosya üzerinde hem okuma hem de yazma yapmak için açılır. w+ dosyayı okumak ve yazmak için yeniden açar. a+ dosyayı okumak ve yazmak için açar en son pozisyonda bekler. 2) Dosyamıza Karakterleri Yazdırmak fputc( ) Fonksiyonu fputc( ) fonksiyonu ile karakterleri text dosyasına kaydedebiliriz. fputc fonksiyonunun kullanım prototipi : fputc( 'karakter', DosyaOku ); Şeklindedir. DosyaOku diye daha önceden açtıgımız emre.txt dosyasına '' arasındaki karakteri yazacaktır. NOT: Sadece karakteri yazar, yani tek harf. FILE *DosyaOku; DosyaOku = fopen("emre.txt","w"); fputc('a',dosyaoku ); fputc('l',dosyaoku ); fputc('i',dosyaoku ); (3)Dosyanın Kapatılması fclose( ) Fonksiyonu En son olarak işimizin bittigini programa söylüyoruz : fclose(dosyaoku); dedigimizde daha önceden açtıgımız dosyamızın artık kapatılmasını söylemiş oluyoruz.
FILE *DosyaOku; DosyaOku = fopen("emre.txt","w"); fputc('a',dosyaoku ); fputc('l',dosyaoku ); fputc('i',dosyaoku ); fclose(dosyaoku); fputs() Fonksiyonu Bu fonksiyon dosyaya katar yazdırmaya yaramaktadır. char dizgi[30] ="nesnetabanliprogramlama"; FILE *dosya_yaz; dosya_yaz = fopen("gulnaz.txt","w"); fputs("gulnaz\tboruzanli\n",dosya_yaz); fputs("ege Universitesi Fen Fakultesi Matematik Bolumu\n",dosya_yaz); fputs(dizgi,dosya_yaz); fclose(dosya_yaz); getchar(); Hem string i tanımlayarak, hem de tanımlamadan text dosyasına yazı yazdırdık. fprintf( ) Fonksiyonu fpintf() fonksiyonu daha geniş bir kullanım alanına sahiptir. Mesela bir dosyadaki yazıları okutup sonra fprintf() fonksiyonu ile baska bir dosyaya yazı yazdırabiliriz, ya da yeni bir dosyanın ismini
ve içine yazılacakları sorarak programınızın içinde oluşturabilirsiniz. Basitçe fprintf() formatlı yazmaya yarar. char ad[30]="gulnaz BORUZANLI"; int no = 100; FILE *dosya_yaz; dosya_yaz = fopen("dene2.txt","w"); fprintf(dosya_yaz,"%s %d",ad,no); fclose(dosya_yaz); Örnek: Girilen sayı asal ise bu sayıyı dosyaya yazan bir C programı yazınız. #include <conio.h> void main () FILE *dosya=fopen("asal.txt","w"); int sayi,i; char asal; do printf("\nbir sayi giriniz="); scanf("%d",&sayi); asal='e'; for(i=2;i<sayi;i++) if(sayi%i==0) asal='h'; if (asal=='e') printf("asal sayi girdiniz %d \n",sayi); fprintf(dosya,"\ngirilen Asal Sayi\t%d",sayi); while(asal=='h'); fclose(dosya); puts("asal sayi dosyaya yazildi"); Örnek: Klavyeden bilgileri girilen 10 ogrencinin bilgilerini dosyaya yazdıran bir program yazınız. #include <conio.h> #include <stdlib.h> void main () FILE *enf=fopen("ogrenci.txt","w"); char ad[20],soyad[20]; int i; long int okulno;
puts("10 ogrenciye ait bilgileri girin:"); for (i=1;i<=10;i++) printf("\n%d. ogrencinin okul numarasi=",i); scanf("%ld",&okulno); printf("%d. Ogrencinin Adi=",i); scanf("%s",&ad); printf("%d Ogrencinin Soyadi=",i); scanf("%s",&soyad); fprintf(enf,"%ld %s %s\n",okulno,ad,soyad); fclose(enf); puts("veriler dosyaya yazildi"); Örnek: Klavyeden girilen iki tamsayı ve toplamını deneme.txt adlı bir dosyaya yazan C programı. FILE *yaz; int x,y,z; yaz = fopen("deneme.txt","w"); printf("toplanacak iki sayi girin : "); scanf("%d %d",&x,&y); z = x+y; fputs( "Bu dosya iki sayinin toplamini gosterir!\n",yaz ); fprintf(yaz,"%d + %d = %d",x,y,z); fclose(yaz); puts("bilgiler kaydedildi. Devam etmek için ENTER tuşuna basın."); getchar(); getc () Fonksiyonu c=getc(fp) şeklinde kullanılır ve pointer ile temsil edilen dosyadan 1 karakter okuyup c değişkenine etirir. fscanf( ) Fonksiyonu fscanf (fp, "biçim tanımları", değişkenler) şeklinde kullanılır. Bildiğimiz scanf gibi çalışmaktadır. Ancak klavyeden değil de bilgileri pointer ile temsil edilen dosyadan okumaktadır. Biçim tanımları kısmı normal scanf komutu ile aynıdır. Örnek: Öncelikle veri.txt ile bir dosya açıp içerisine sayıyı kaydedin. Sonra aşağıdaki programı derleyip çalıştırın. Programi çalistirinca sabit diskinizde cikti.txt seklinde bir dosya olusacaktir. int x; FILE *oku, *yaz; oku=fopen("veri.txt","r");
yaz=fopen("cikti.txt","w"); fscanf(oku,"%d",&x); fprintf(yaz,"x=%d\n",x); fclose(oku); fclose(yaz); printf("veri cikti.txt dosyasina yazildi\n"); Bu program bir dosyaya formatlı yazılmış olan verileri okur ve ekrana basar. ** tipler.dat dosyasına Ahmet d 1256 65489878 0.822 kaydedip, aşağıdaki program ile dosyadan okuyup ekrana yazdıralım. FILE *oku; char ktr[10],kr; int tam; long uzun_tam; float reel; oku=fopen("tipler.dat","r"); fscanf(oku,"%s\n%c\n%d\n%ld\n%f", ktr,&kr,&tam,&uzun_tam,&reel); fclose(oku); puts("dosyadan okunan veriler sirasiyla:"); printf("%s\n%c\n%d\n%ld\n%f",ktr,kr,tam,uzun_tam,reel);