duyuruElektroArge.com'a Hoşgeldiniz. Üye Olmak İçin Tıklayın. duyuru





houseForum ana sayfa   iletişimİletişim   bilgiSSS  
kırmızı yeşil mavi
ekleKayıt  anahtarGiriş
evForum ana sayfa goE-Kütüphane goE-Ders goC
 

  • Reklam

Ders 51 Dosyadan Veri Okumak

C Dili Dersleri - Okan Bilke

Ders 51 Dosyadan Veri Okumak

Mesajgönderen okanbilke » 06 Mar 2014 00:37

Dosyadan Bir Karakterlerlik Verinin Okunması - getc() Fonksiyonu
Şimdi bir text dosyasından programımıza nasıl veri okuyacağımızı görelim. Bir text dosyasından veri okumanın birden fazla yolu vardır. Bunlardan ilki bir karakterlik veri okumak için kullanılan getc() fonksiyonudur.
getc() fonksiyonunun prototipi şu şekildedir:
int getc(FILE *akis);

Şimdi getc() fonksiyonunun nasıl kullanıldığını görebileceğimiz bir program yazalım. Programımızı yazmaya başlamadan önce bilgisayarımızın C:\ sürücüsünde bir text dosyası oluşturalım(Siz text dosyanızı istediğiniz dizin altında oluşturabilirsiniz ancak program içerisinde de bu dizini kullanmayı unutmayın).
C:\ dizini altında bir text dosyası oluşturun ve ismini get_c_ornek.txt olarak belirleyin. İçerisine de kendi isminizi yazın:
Resim

Şimdi programımızı yazabiliriz.
//dosyadan_karakter_oku.c - 02.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

int main()
{
FILE *ptDosya;
char ch;
// dosyayı aç:
ptDosya = fopen("C:\\get_c_ornek.txt", "r");

// bir karakter oku:
ch = getc(ptDosya);

// okunan karakteri ekrana yaz:
printf("dosyanan okunan karakter: %c", ch);

// dosyayı kapat:
fclose(ptDosya);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

Programın 10. satırında get_c_ornek.txt isimli dosyayı, okuma amaçlı olarak "r" ifadesi ile açıyoruz. 13. satırda da getc() fonksiyonu ile dosyadan bir karakter okuyoruz ve fonksiyonun döndürdüğü karakteri ch değişkenine atıyoruz. 16. satırda bu karakteri ekrana yazdırarak 19. satırda dosyayı kapatıyoruz.
Programın ekran çıktısı şöyle olacaktır:
dosyanan okunan karakter: O

Gördüğünüz gibi dosyadan sadece bir karakter okundu. Dosyadaki tüm karakterleri okumak için bir döngü kullanarak dosyadaki karakter sayısı kadar getc() fonksiyonunu kullanabiliriz. Örneğin dosyada 20 karakter varsa, bir döngü ile 20 defa getc() fonksiyonu kullandığımızda dosyadaki tüm karakterleri okumuş oluruz. Peki, dosyada kaç karakter bulunduğunu nerden bileceğiz? İşte bu soru dosya işlemlerinde çok önemli bir kavramı ortaya çıkarıyor: Dosya sonu kavramı.

Dosya Sonu Kavramı
C fonksiyonları ile bir dosya açtığımızda, dosya içerisinde konum göstergeci adı verilen kavramsal bir yapının oluştuğunu varsayarız. Konum göstergeci, o dosyadan her bir karakter okunuşunda bir ilerler. Dosya ilk açıldığında konum göstergecinin yeri de dosya başıdır. Biz dosyadan bir karakter okuduğumuzda göstergeç de bir ilerler. Biz getc() fonksiyonu ile bir karakter daha okumak istediğimizde bu defa okunacak dosyadaki ikinci karakter olacaktır çünkü konum göstergeci bu karakteri göstermektedir. Biz fonksiyonla ikinci karakteri okuduğumuzda konum göstergeci yine bir ilerleyecek ve bu durum dosyanın sonuna kadar böyle gidecektir. Konum göstergeci dosyanın sonuna geldiğinde, yani dosyada okunacak başka karakter kalmadığında bunu bize bildirir. Biz de böylece okuma işlemini durdururuz. Eğer okunacak karakter kalmadığı halde(yani dosya sonuna gelindiğinde) okuma işlemine devam edersek hata ile karşılaşırız.
Resim

Konum göstergeci dosya sonunu gösterene kadar dosya içinde okuma yapabileceğimizi söyledik. Peki, örneğin getc() fonksiyonu ile okuma yaparken dosya sonuna gelip gelmediğimizi nasıl bileceğiz? Bunu yapmanın yolu, getc() fonksiyonu ile okuduğumuz her karakteri, yani fonksiyonun döndürdüğü her değeri kontrol etmektir. Çünkü fonksiyon dosya sonuna geldiğinde, EOF isminde, önceden tanımlanmış bir değer döndürür. Böylece EOF ile karşılaştığımızda dosya sonuna gelmiş olduğumuzu anlar ve okuma işlemini durdurururz. Dönen değerin EOF olup olmadığını ise şöyle kontrol edeceğiz:
ch = getc(ptDosya);

if(ch == EOF)
// dosya sonuna geldik, okumayı durdur
else
// dosya sonu değil, okumaya devam edebiliriz

3. satırdaki if() deyimi ile, 1. satırda geçen getc() fonksiyonu ile okuduğumuz karakterin EOF olup olmadığını kontrol ediyoruz.
Şimdi, içinde adımız ve soyadımızın yazılı olduğu dosya içindeki tüm karakterleri getc() fonksiyonunu bir döngü içerisinde kullanarak okuyalım. Okuma işlemi sırasında döngünün her işleyişinde de dosya sonuna gelip gelmediğimizi kontrol edelim.
//dosya_sonu_kontrolu.c - 02.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

int main()
{
FILE *ptDosya;
char ch;
// dosyayı aç:
ptDosya = fopen("C:\\get_c_ornek.txt", "r");

// dosya sonuna gelene kadar tüm karakterleri oku:
do {
ch = getc(ptDosya);
// okunan karakterleri ekrana yaz:
printf("%c", ch);
} while (ch != EOF);

printf("\n\ndosya sonuna gelindi, okuma islemi bitti!!");

// dosyayı kapat
fclose(ptDosya);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

13. ve 17. satırlardaki döngü sayesinde dosya içerisindeki tüm karakterler tek tek okunarak ekrana yazdırılacaktır. 14. satırda bir karakter okunduğunda, okunan bu karakter 17. satırda kontrol edilecek ve eğer okunan karakter EOF değilse, yani henüz dosya sonuna gelinmemişse döngü tekrar işleyecek, bir karakter daha okunacak ve ekrana yazdırılacaktır. Bu durum, 15. satırda okunan karakter EOF olana kadar bu şekilde devam edecektir.
Programımızın ekran çıktısı şu şekilde olacaktır:
Okan Bilke 

dosya sonuna gelindi, okuma islemi bitti!!

Şimdi EOF ifadesini biraz daha yakından tanıyalım. EOF, End Of File(dosya sonu) kelimelerinin baş harflerinden oluşmuştur. stdio.h dosyası içerisinde tanımlanmış bir sabittir. Değeri -1'dir. stdio.h dosyasını bir text editöründe açacak olursanız EOF sabiti görebilirsiniz:
Resim

Resimde #define EOF (-1) satırı görülüyor. Dosya okuma işlemlerinde EOF sabitini çok sık kullanacağız.
Dosya sonu kontrolü yapmanın bir diğer yolu da feof() fonksiyonunu kullanmaktır.

feof() Fonksiyonu
feof() fonksiyonu, dosya sonu olduğunda geriye pozitif bir değer döndürür. Böylece biz de bu değeri kontrol ederek dosya sonunun gelip gelmediğini kontrol edebiliriz. Fonksiyonun prototipi şu şekildedir:
int feof(FILE *akis);

Bir önceki örnekte hatırlayacağınız gibi dosya sonu kontrolünü doğrudan getc() fonksiyonu ve EOF sabiti ile yapmıştık. Şimdi ise bu kontrolü feof() fonksiyonu ile yapacağız. Bu program için de yine get_c_ornek.txt dosyasını kullanacağız. Siz elbette istediğiniz başka bir text dosyası kullanabilirsiniz.
//feof_ornek.c - 02.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

int main()
{
FILE *ptDosya;
char ch;
// dosyayı aç:
ptDosya = fopen("C:\\get_c_ornek.txt", "r");

// dosya sonuna gelene kadar tüm karakterleri oku:
do {
ch = getc(ptDosya);
// okunan karakterleri ekrana yaz:
printf("%c", ch);
} while (!feof(ptDosya));

printf("\n\ndosya sonuna gelindi, okuma islemi bitti!!");

// dosyayı kapat
fclose(ptDosya);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

17. satırda dosya sonu kontrolünün nasıl yapıldığına dikkat ediniz:
} while (!feof(ptDosya));

feof() fonksiyonunun geriye EOF sabitini değil pozitif bir değer döndürdüğüne dikkat ediniz.
Programın ekran çıktısı dosya içeriğindeki gibi olacak:
Okan Bilke


Verilerin Topluca Okunması: fgets() Fonksiyonu
Buraya kadar olan programlarda verileri dosyadan bir döngü yardımıyla karakter karakter okuduk. Bu, belli durumlarda kullanılabilecek bir yöntemdir. Kullanabileceğimiz bir diğer yöntem de verilerin karakter karakter değil, topluca okunmasıdır. Bunun için fgets() fonksiyonunu kullanırız. fgets() fonksiyonu, bir dosyadan belirtilen sayıda karakter okumak için kullanılır. Prototipi şu şekildedir:
char *fgets(char *string, int uzunluk, FILE *akis);

Prototip biraz karışık görünüyor ancak fonksiyonun kullamı oldukça basittir. Fonksiyon, akis parametresi ile belirtilen dosyadan, uzunluk parametresi ile belirtildiği kadar(20 karakter, 30 karakter vs..) karakter okur ve okuduğu bu karakterleri string parametresinin gösterdiği adrese yerleştirir(geriye döndürdüğü değer de yine bu adrese bir referanstır).
Örneğin dosyamızın içerisinde aşağıdaki verinin bulunduğunu ve bunu fgets() fonksiyonu ile okuyacağımızı düşünelim:
hayatta ben en cok babami sevdim..

fgets() fonksiyonunu kullanmadan önce okuyacağımız veriyi yerleştireceğimiz bir gösterici tanımlayalım:
char *veri;

Şimdi fgets() ile dosyadan veriyi okuyarak veri göstericisi ile gösteren alana yerleştirebiliriz:
fgets (veri, 36, akis);

Artık veriyi dosyadan okuyarak belleğe yerleştirdik. Bellekten okuduğumuz karakter sayısı 35 olacaktır(ikinci parametrenin bir eksiği kadar. Nedenine geleceğiz!). Bellekten ekrana yazdırmak için de daha önceden bildiğimiz yollarla veri göstericisini kullanırız:
puts(veri);

Şimdi bu anlattıklarımızı bir program içerisinde görelim. Bir text dosyası hazırlayarak ismini fgets_ornek.txt yaptınız ve içerisinde
hayatta ben en cok babami sevdim...

ifadesi yazarak C:\ sürücüsüne kaydediniz. Sonra programınızı yazarak çalıştırınız.
//fgets.c - 05.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

int main()
{
FILE *ptDosya;
char veri[40];

// dosyayı aç:
ptDosya = fopen("C:\\fgets_ornek.txt", "r");

fgets(veri, 36, ptDosya);
puts(veri);

// dosyayı kapat:
fclose(ptDosya);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

8. satırda öncelikle okuyacağımız veriyi yerleştireceğimiz bellek alanı için bir gösterici tanımladığımıza dikkat ediniz. 13. satırda fgets() fonksiyonu ile ptDosya ile gösterilen dosyadan 35 adet karakter okuyarak veri göstericisi ile gösterilen adrese yerleştirdik. Daha sonra 14. satırda artık bellekte bulunan verileri çıktı ekranına aktardık:
hayatta ben en cok babami sevdim...

fgets() fonksiyonu dosyadan okuduğu verinin sonuna bir NULL karakter ekleyerek belleğe yerleştirir. Bu durumda eğer dosyadan örneğin 10 karakter okunmuşsa, belleğe 11 karakter yerleştirilecektir. Fonksiyonu kullanırken bu duruma dikkat etmeliyiz.
fgets() fonksiyonu sadece belirtilen sayıda karakteri okuduktan sonra değil aynı zamanda dosya sonu ile veya yeni satır karakteri ile karşılaştığında da okuma işlemine son verir. Toparlarsak fgets() fonksiyonu şu durumlarda okuma işlemine son verir:
  1. Belirtilen sayıda karakter okuduktan sonra.
  2. Yeni satır karakteri ile karşılaştığında.
  3. Dosya sonu geldiğinde.
Fonksiyonun yeni satır karakterini görünce okuma işlemini durdurduğunu test etmek için aşağıdakine benzer bir text dosyası hazırlayarak tamamını okutmaya çalışınız:
Resim

Bu dosyayı fgets() fonksiyonu ile okuttuğunuzda fonksiyon sadece ilk satırı okuyacak ve belleğe yerleştirilen tek ifade "birinci satir" ifadesi olacaktır. Dosyada birinci satır sonunda bulunan yeni satır(enter) karakteri sebebiyle fonksiyon diğer satırları okumayacaktır.

Verilerin Topluca Yazılması: fputs() Fonksiyonu
Verileri karakterler halinde tek tek olarak değil de topluca bir dosyaya yazmak için fputs() fonksiyonu kullanırız. fputs() fonksiyonu fgets() fonksiyonun yaptığı işin tersini yapar.
Fonksiyonun prototipi şu şekildedir:
int fputs(char *string, FILE *akis);

akis, bildiğiniz gibi yazılacak dosyayı gösteren parametredir. string ise, dosyaya yazılacak verinin tutulduğu adresi belirten göstericidir. Fonksiyon yazma işlemini başarılı bir şekilde yerine getirirse geriye 0(sıfır) değeri döndürür. Şimdi örnek bir program yapalım program içinden bazı cümleleri bir dosyaya yerleştirelim.
//fputs.c - 05.03.2014 - Okan BİLKE -www.elektroarge.com

#include <stdio.h>

int main()
{
FILE *ptDosya;
char *veri01;
char *veri02[40];

// dosyayı aç:
ptDosya = fopen("C:\\fputs_ornek.txt", "w");

veri01 = "bilisim ";
veri02 = "teknolojileri";

fputs(veri01, ptDosya);
fputs(veri02, ptDosya);

// dosyayı kapat:
fclose(ptDosya);

return 0;
}
//bu dosya elektroarge.com'dan indirilmiştir.

Resim


Ders İçinde Yazılmış Tüm Programlar ve Kodları Ektedir:
Mesaj içeriğini görmek için kayıt ve giriş gerektirir

DERS 52 DOSYA SONUNA VERİ EKLEMEK

C Dili Dersleri Ders Listesi
okanbilke@gmail.com
Kullanıcı avatarı
okanbilke
Site Kurucusu
Site Kurucusu
 
Mesajlar: 721
Beğendiklerim: 0 mesaj
Beğenilenlerim: 0 mesaj
Kayıt: 15 Mar 2013 13:09
Konum: Ankara

Reklam

Dön C

Kimler çevrimiçi

Bu forumu gezen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 0 misafir


  • Reklam
cron