10. DOSYA GİRİŞ ÇIKIŞ FONKSİYONLARI İkincil bellekte tanımlanmış bölgelere dosya denir. Her dosyanın bir ismi vardır. Ancak dosyaların isimlendirme kuralları sistemden sisteme göre değişebilmektedir. Dosya işlemleri tamamen işletim sisteminin kontrolü altındadır. Bir dosya üzerinde işlem yapmadan önce dosya açılmalıdır. Dosya açabilmek için işletim sisteminin dosya aç isimli bir sistem fonksiyonu kullanılır. Dosyanın açılması sırasında dosya ile ilgili çeşitli ilk işlemler işletim sistemi tarafından yapılır. Dosya açma işlemi iki basamaklı bir işlemdir, dosya açılmadan önce, o dosya ile ilgili bir işaretçinin tanımlanması yapılır. Bu tanımlama FILE tipinde işaretçi değişken ile yapılır. FILE *yaz; //FILE yapısı stdio.h içerisinde tanımlı İkinci aşamada dosya açma deyimi kullanılır. yaz = fopen(dosya_adı, mod) Dosya_Adı: Açmak istediğimiz dosyanın adı. Büyük - küçük harf ayrımı yok. Mod: Kullanım amacı, okuma, yazma değişiklik gibi. fopen fonksiyonun genel deklarasyonu (bildirimi) şu şekildedir. FILE *fopen (const char *fname, const char *mode) Fonksiyonun 1. Parametresi açılacak dosyanın ismidir. Dosya ismi path içerebilir. Dizin geçişleri için / de konulabilir. 2. Parametre açış modudur.açış modu şunlar olabilir : Mode "w" "w+" Anlamı Dosyayı yazmak için açar. Dosyadan okuma yapılamaz. Dosyanın mevcut olması zorunlu değildir. Dosya mevcut değilse yaratılır. Dosya mevcut ise sıfırlanır. Dosyayı yazma ve okuma için açar. Dosyanın mevcut olması zorunlu değildir. Dosya mevcut değilse yaratılır. Dosya mevcut ise sıfırlanır.
"r" "r+" "a" "a+" Dosyayı okuma için açar. Dosyaya yazma yapılamaz. Dosya mevcut değilse açılamaz. Dosyayı okuma ve yazma için açar. (Dosyanın pozisyon göstericisi dosyanın başındadır). Dosya mevcut değilse açılamaz. Dosyayı sonuna ekleme için açar. Dosyadan okuma yapılamaz. Dosyanın mevcut oaması zorunlu değildir. Dosya mevcut değilse yaratılır. Dosyayı sonuna ekleme ve dosyadan okuma için açar. Dosyanın mevcut olması zorunlu değildir. Dosya mevcut değilse yaratılır. Fonksiyonun geri dönüş değeri FILE yapısı türünden bir adrestir. Dosya çeşitli sebeplerden dolayı açılamayabilir. Bu durumda fopen NULL gösterici döndürür. Fonksiyonun geri dönüş değeri kesinlikle kontrol edilmelidir. Tipik bir kontrol işlemi aşağıdaki gibi yapılabilir: if ((yaz= fopen( c:\oku, r )) == NULL) printf( Dosya Açılamadı...\n); exit(1); Açılan dosya ile ilgili işlem bittikten sonra dosyanın kapatılması gerekmektedir. Dosyanın kapatılması açılması sırasında yapılan işlemlerin geri alınmasını sağlar. Örneğin dosyanın kapatılması sırasında, işletim sisteminin dosya tablosunda bulunan bu dosyaya ilişkin bilgiler silinir. Dosya kapama işlemi fclose fonksiyonu ile gerçekleştirilir. int fclose(file *stream); Bu fonksiyon açılmış olan bir dosyayı kapatır. Fonksiyon fopen ya da fropen fonksiyonundan elde edilen FILE yapısı türünden adresi parametre olarak alır ve açık olan dosyayı kapatır. Fonksiyonun geri dönüş değeri 0 ise dosya başarılı olarak kapatılmıştır. Fonksiyonun geri dönüş değeri EOF ise dosya kapatılamamıştır. EOF stdio.h içinde tanımlanan bir sembolik sabittir ve derleyicilerin çoğunda (-1) olarak tanımlanmıştır. Fonksiyonun başarısı ancak şüphe altında test edilmelidir. Normal şartlar altında dosyanın kapatılmaması için bir neden yoktur. int main()
FILE *f; if ((f = fopen( data, w )) ==NULL) printf( cannot open file...\n); exit(1); fclose(f); return 0; Örnek1 Dosyaya yazma #include <stdio.h> main() FILE *kp; char *s; int i; kp = fopen("dene", "w"); /* NULL ise işlem başarısız */ if (kp == NULL) exit(1); for (i=0; i<5; i++) gets(s); fprintf(kp, "%s\n", s); getch(); fclose(kp); /* kütüğü kapatır. Program sona erdiğinde otomatik kapatılır */ /* fcloseall() hepsini kapatır. Dönen, kapanan kütük sayısı. Hata var ise EOF döner */
Yazarken kullanılan fprintf deyiminin çalışması printf gibidir. Sadece ilk parametre olarak kütük değişkenini vermek gerekir. Benzer kütük işlevleri int fgetc(file *stream); int fputc(int c, FILE *stream); char *fgets(char *s, int n, FILE *stream); n-1 karakter veya satır sonuna kadar okur int fputs(const char *s, FILE *stream); satır sonu bilgisini ayrıca yazmak gerekir Örnek 2: Dosyadan okuma #include <stdio.h> main() FILE *kp; char *s; int i; kp = fopen("dene", "r"); if (kp == NULL) exit(1); for (i=0; i<5; i++) fscanf(kp, "%s", s); printf("%s\n", s); /* Kütükteki kayıt sayısı bilimiyor ise */ rewind(kp); /* fseek(stream, 0L, SEEK_SET) SEEK_SET 0 baştan SEEK_CUR 1 bulunulan yerden SEEK_END 2 sondan */ fscanf(kp, "%s", s);
while (!feof(kp)) printf("%s\n", s); fscanf(kp, "%s", s); getch(); int feof(file *) : kütüğün sonuna erişilmiş ise sıfırdan farklı bir değer alır. Aksi halde sıfırdır. rewind(file *) : kütük işaretçisinin (kütükteki hangı kayıdın okunacağı bilgisi) kütüğün başını göstermesini sağlar. Örnek 3: Bir RL devrenin çözümünün dosyaya yazdırılması. #include "stdio.h" #include "conio.h" #include "math.h" #include "stdlib.h" #define ADIM 0.00001 #define T0 0 #define TS 0.01 void main () FILE *kp; double f,t; double r,l,v,i,vr; r=10.0; l=0.01; v=50.0; kp=fopen("c:\\sonuc.dat","w"); if(kp==null) printf("dosya Acma Hatasi"); exit(1); for(t=adim;t<ts;t=t+adim)
f=-r*t/l; i=v/r*(1-exp(f)); fprintf(kp,"%6.8f %12.8f\n",t,i); printf("%6.8f %12.8f\n",t,i); Örnek 4: Bir fonksiyonun hesaplanan değerlerinin kütüğe yazdırılması. 1-exp(-x) fonksiyonu 0-10 aralığında 0.02 adımlarla hesaplanıp kütüğe yazılıyor #include <stdio.h> #include <math.h> #define ADIM 0.02 #define T0 0 #define TS 10 main() FILE *kp; double f, t; kp = fopen("sonuc.dat", "w"); if (kp == NULL) exit(1); for (t=t0; t<ts; t = t + ADIM) f = 1 - exp(-t); fprintf(kp, "%6.3f %12.8f\n", t, f); printf("%6.3f %12.8f\n",t, f); getch(); Örnek 5: Rehber defteri # include <stdio.h> # include <conio.h> # include <string.h> FILE *dosya1; FILE *dosya2;
char ad[20],soyadi[20],ads[20], tel[15]; char devam,s; void GIRIS(void); void DUZELT(void); void SIL(void); void LISTE(void); void ARA(void); void menu() textcolor(5); do gotoxy (10,5); printf("ana MENU\n"); gotoxy (10,6); printf("1-giris\n "); gotoxy (10,7); printf("2-duzeltme \n "); gotoxy (10,8); printf("3-silme \n "); gotoxy (10,9); printf("4-arama \n "); gotoxy (10,10);printf("5-LISTELEME\n "); gotoxy (10,11);printf("6-CIKIS\n"); s=getch(); switch(s) case '1': GIRIS(); break; case '2': DUZELT(); break; case '3': SIL(); break; case '4': ARA(); break; case '5': LISTE(); break; case '6': break; default: gotoxy(10,24);printf("yanlis deger girildi...\n"); break; while (s!='6'); ; void GIRIS() dosya1=fopen("rehber.dat","w+"); if (ferror(dosya1)) fclose(dosya1); dosya1=fopen("rehber.dat","w+"); do gotoxy(5,5);printf("kayit GiRiSi \n"); gotoxy(5,6);printf("------------\n");
gotoxy(5,7);printf("adi...:");scanf("%s",ad); gotoxy(5,8);printf("soyadi...:");scanf("%s",soyadi); gotoxy(5,9);printf("telefon...:");scanf("%s",tel); fprintf(dosya1,"%s\n",ad); fprintf(dosya1,"%s\n",soyadi); fprintf(dosya1,"%s\n",tel); fflush(stdin); /*btdin: Girişler klavyeden ekrana yapılacaktır*/ gotoxy(25,24);printf("devam edecek misiniz...:"); devam=getch(); while (clrscr(),devam!='h'); fclose(dosya1); ; /********************/ void DUZELT() do dosya1=fopen("rehber.dat","r+"); dosya2=fopen("yedek.dat","w+"); gotoxy(1,1);printf("duzeltilecek kaydin adi.:"); scanf("%s",ads); while (feof(dosya1)==0) fflush(stdin); fscanf(dosya1,"%s\n",ad); fscanf(dosya1,"%s\n",soyadi); fscanf(dosya1,"%s\n",tel); if (strcmp(ad,ads)==0) gotoxy(3,2);printf("adi\t:%s\n",ad); gotoxy(3,3);printf("soyad\t:%s\n",soyadi); gotoxy(3,4);printf("telefon\t:%s\n",tel); gotoxy(3,5);printf("===========================================\n"); gotoxy(3,9);printf("yen \n"); gotoxy(3,10);printf("adi...:");scanf("%s",ad); gotoxy(3,11);printf("soyadi...:");scanf("%s",soyadi); gotoxy(3,12);printf("telefon...:");scanf("%s",tel); fprintf(dosya2,"%s\n",ad); fprintf(dosya2,"%s\n",soyadi); fprintf(dosya2,"%s\n",tel); gotoxy(25,24);printf("devam edecek misiniz...:"); devam=getch(); while (clrscr(),devam!='h'); fclose(dosya1); fclose(dosya2); unlink("rehber.dat");
rename("yedek.dat","rehber.dat"); ; /******************/ void SIL() do dosya1=fopen("rehber.dat","r+"); dosya2=fopen("yedek.dat","w+"); gotoxy(1,1);printf("silinecek kaydin adi...:"); scanf("%s",ads); while (feof(dosya1)==0) fflush(stdin); fscanf(dosya1,"%s\n",ad); fscanf(dosya1,"%s\n",soyadi); fscanf(dosya1,"%s\n",tel); if(strcmp(ad,ads)==0) gotoxy(3,2);printf("adi\t:%s\n",ad); gotoxy(3,3);printf("soyadi\t:%s\n",soyadi); gotoxy(3,4);printf("telefon\t:%d\n",tel); gotoxy(3,10);printf("silinecek kayit bu mu?..:"); devam=getch(); if(devam=='e') continue; else fprintf(dosya2,"%s\n",ad); fprintf(dosya2,"%s\n",soyadi); fprintf(dosya2,"%s\n",tel); gotoxy(25,23);printf("silinecek kayit bulunamadi...:"); gotoxy(25,24);printf("devam edecek misiniz...: "); devam=getch(); while (clrscr(),devam!='h'); fclose(dosya1); fclose(dosya2); unlink("rehber.dat"); rename("yedek.dat","rehber.dat"); ; /****************/ void LISTE() int Z=5;
do dosya1=fopen("rehber.dat","r+"); while(feof(dosya1)==0) fflush(stdin); fscanf(dosya1,"%s\n",ad); fscanf(dosya1,"%s\n",soyadi); fscanf(dosya1,"%s\n",tel); gotoxy(1,3);printf("adi Soyadi Telefon "); gotoxy(1,4);printf("----------------------------------------------\n"); gotoxy(2,z); printf("%s\n",ad); gotoxy(18,z);printf("%s\n",soyadi); gotoxy(35,z);printf("%s\n",tel); Z++; if(z==22) printf("devam icin bir tusa basiniz"); devam=getch(); Z=5; continue; gotoxy(10,24);printf("liste Sonu. Devam icin bir tusa basiniz"); getch(); while (clrscr(),kbhit()); fclose(dosya1); void ARA() do dosya1=fopen("rehber.dat","r+"); dosya2=fopen("yedek.dat","wt"); gotoxy (1,1);printf("Aranan kaydin adi...: "); scanf("%s",ads); while (feof(dosya1)==0) fflush(stdin); fscanf(dosya1,"%s\n",ad); fscanf(dosya1,"%s\n",soyadi); fscanf(dosya1,"%s\n",tel); if (strcmp(ad,ads)==0) gotoxy(3,2);printf("adi\t:%s\n",ad ); gotoxy(3,3);printf("soyadi\t:%s\n",soyadi ); gotoxy(3,4);printf("telefon\t:%s\n",tel);
gotoxy(25,24);printf("devam edecek misiniz?...\n"); devam=getch(); while (clrscr(),devam!='h'); fclose(dosya1); ; /**********/ void main(void) menu(); 11. BAZI MATEMATİK FONKSİYONLARININ KULLANIMI #include "iostream.h" #include "math.h" #include "complex.h" void main () double aci,deger,x; deger=cos(m_pi); //aci radyan olarak verilir. cout<<deger; cout<<"\n hesaplama icin aci giriniz(derece)...:"; cin>>x; aci=(m_pi*x)/180.0; deger=cos(aci); cout<<"\n cos("<<x<<")="<<deger; deger=sin(aci); cout<<"\n sin("<<aci<<")="<<deger; aci=asin(deger); cout<<"\n arcsin("<<deger<<")="<<aci; complex r=complex(3.0,4.0); cout<<"\n Z="<<(complex(r)); cout<<"\n reel kismi="<<real(complex(r)); cout<<"\n sanal kismi="<<imag(complex(r)); cout<<"\n genlik="<<abs(complex(r)); aci=arg(complex(r)); aci=aci*180.0/m_pi; cout<<"\n Argumani="<<aci; x=16.0; cout<<"\n" <<x<<" karekoku="<<sqrt(x); aci=pow(x,2); cout<<"\n" <<x<<" karesi ="<<aci; x=3; aci=pow(10,x); cout<<"\n10 " <<x<<" kuvveti ="<<aci; cout<<"\ne=" <<exp(1.0);
KAYNAKLAR Şevki DEMİRBAŞ, Oğuz ÜSTÜN ve Nihat ÖZTÜRK, Beltek kursu ders notları, Gazi Üniversitesi Pektaş H., C Dili Kullanarak Bilgisayar Programlama, KOU EHM, Ders Notları. Sistem Programlama ve İleri C Uygulamaları.