Dosya İşlemleri #5 – C Programlama Dili

in #tr5 years ago


C Programlama dili derslerinin bir önceki dersinde string verileri komple tek hamle ile okuyup yazabileceğimiz iki fonksiyondan bahsetmiştik : fputs() ve fgets()

Dosya Okuma ve Yazma İşlemleri

fputs() ve fgets() fonksiyonlarının kullanımı hakkında bilgi verdikten sonra uygulamasını görebilmek adına bir uygulamasını yapmıştık.

Şimdi de aynı amaç için kullanılan iki fonksiyondan bahsedelim.

fprintf() ve fscanf() Fonksiyonları

Bu fonksiyonlar da tıpkı fputs() ve fgets() fonksiyonları gibi dosyalara string halinde veri yazma ve okuma işleminde kullanılır.

Bu fonksiyonlardan fprintf() fonksiyonu tıpkı  printf() fonksiyonu gibi çalışır. printf() fonksiyonu bildiğiniz üzere ekrana veri yazmak için kullanılıyordu. fprintf() fonksiyonu ise ekran yerine dosyaya karakter dizisi yazmak için kullanılır.

fprintf() fonksiyonu normal olarak çalıştığında, dosyaya yazdığı byte sayısını geri döndürürken olası bir hata durumunda EOF  değerini geri döndürür.

fscanf()  fonksiyonu da aynı şekilde scanf() fonksiyonu gibi çalışır. scanf() fonksiyonu ekrandan değer okumak için kullanılırken fscanf() fonksiyonu  dosyadan değer okumak için kullanılır.

fscanf() fonksiyonu normal çalıştığı durumlarda dosyadan okuduğu ve değişkene yüklediği byte sayısını geri döndürür. Bu fonksiyon ayrıca dosya sonunu okuduğunda EOF değerini ve hiçbir okuma yapmazsa 0(sıfır) değerini geri döndürür.

Şimdi de bu iki fonksiyonun kullanımı hakkında fikir vermesi için prototiplerini görelim.

fprintf() fonksiyonunun prototipi aşağıdaki gibi tanımlanmıştır :

int fprintf ( FILE *fPointer, char *kontrolDizisi, ….);

fscanf() fonksiyonunun prototipi aşağıdaki gibi tanımlanmıştır :

int fscanf ( FILE *fPointer, char *kontrolDizisi, …);

Bu kadar açıklamadan sonra bu fonksiyonların bir uygulama içinde nasıl kullanıldığı hakkında fikir sahibi olmak için basit bir uygulama yapalım :

Uygulama üzerine konuşalım.

Uygulamanın başındaki kütüphane tanımlarını atlarsak uygulamamız main() fonksiyonu ile başlıyor. main() fonksiyonunun başındaki bildirimleri inceleyelim :

FILE *fPointer;

ifadesi ile FILE tipinde adı fPointer olan bir dosya göstericisi tanımlıyoruz ki bu gösterici, dosyalar üzerinde işlem yapabilmemiz için gerekli.

char chdizi[80] = "CProgramlamaDersleri-Dosyaİşlemleri";

ifadesi ile chdizi[] adında 80 karakterlik bir karakter dizisi tanımlayıp ilk değer atamasını yapıyoruz. İlk değer atamasında niçin boşluk karakteri kullanmadığımı ileride anlarsınız.

int iSayi = 156;

float fSayi = 1555.626;

bildirimleri ile de iSayi ve fSayi adında iki adet sayı değişkeni tanımlıyoruz. Bunlar int ve float tipinde olup ilk değer atamaları yapılmıştır.

char chSayilar[10];

bu dizi tamamen bir şeyi test amaçlı oluşturulmuştur. Uygulamayı anlatırken sebebine değineceğim.

Bildirimlerden sonra gelen

fPointer = fopen("deneme.txt", "w");

kodunu kullanarakfopen() fonksiyonu ile  yazma modunda açtığımız deneme.txt dosyasının adresini fPointer  pointerına atıyoruz.

Yeri gelmişken file pointerlarla alakalı anlamlı bir tanım yapmak istiyorum. Yani doğruluğu tartışılsa da pratikte böyle olduğunu düşündüğüm bir düşünce :

File Pointer olarak ifade ettiğimiz dosya göstericileri aslında fiziksel dünyadaki dosyaların kod dünyasındaki/ortamındaki temsilcileridir. Bu tanım aklıma object oriented kavramından gelmiştir.

Uygulamanın bundan sonraki kısmında dosya yazma işlemi yapılacaktır ama öncesindeki if() sorguları, dosyamızın yazma modunda başarılı bir şekilde açılıp açılmadığını sorgulamaktadır.

Eğer dosyamız yazma modunda başarılı bir şekilde açılmışsa aşağıdaki kodlar işlenecektir :

printf("\n\tdeneme.txt dosyasi basariyla yazma modunda acildi.\n");

fprintf(fPointer,"%s %s %d %f",chdizi,"Sayılar:",iSayi,fSayi);

fclose(fPointer);

printf("\n\tDosya yazdirildi...\n\n");

Görüldüğü gibi ilk olarak printf fonksiyonu ile ekrana

“deneme.txt dosyasi basariyla yazma modunda acildi.”

Mesajı verildikten sonra

fprintf(fPointer,"%s %s %d %f",chdizi,"Sayılar:",iSayi,fSayi);

fprintf() fonksiyonu ile dosyaya birer boşlukla ayrılmış şekilde

chdizi, “Sayılar”, iSayi, fSayi

değişkenleri yazdırılıyor. Parametrelerin kullanımına dikkat edelim. Çift tırnak içerisindeki ifadeye yazımızı şekillendirici sabitler koyabiliriz. \n \t “ve” gibi.

fclose(fPointer);

kodu ile dosyamızı kapattıktan sonra, printf() fonksiyonu ile ekrana “Dosya yazdirildi” mesajını veriyoruz.

Görüldüğü gibi fprintf() fonksiyonu ile aynı anda hem bir string ifadeyi hem bir sabiti hem de sayısal değerleri dosyaya yazabildik. Bu yönden oldukça kullanışlı bir fonksiyon.

Uygulamanın bundan sonraki kısmında değişkenleri temizleme kodları bulunuyor :

strcpy(chdizi, ""); // string dizisi boşaltıldı

printf("\n\n\tchdizi : %s",chdizi); //kontrol

iSayi = 0, fSayi = 0.0 ;

strcpy() fonksiyonu ile chdizi[] dizisinin içeriğini boş bir string ile değiştiriyoruz. Sonrasında gelen printf() fonksiyonu tamamen kontrol amaçlıdır, dizinin içeriğinin temizlenip temizlenmediğini bizlere göstermek için kullanıldı.

iSayi = 0, fSayi = 0.0 ;

kodu ile de sayısal değerlerimizin içeriğini sıfırlamış olduk.

Uygulamanın son kısmında ise dosyaya yazdırmış olduğumuz değerleri okuyacağız. Bunun için de fscanf() fonksiyonunu kullanacağız.

En son dosyamızı kapatmıştık. Şimdi okuma işlemine başlamadan önce tekrar dosyamızı açmamız gerekiyor.

fPointer = fopen("deneme.txt","r");

komutu ile deneme.txt dosyasını okuma modunda açmış olduk. Sonrasında gelen if() yapıları yine dosyamızın okuma modunda başarılı bir şekilde açılıp açılmadığını sorgulamaktadır.

Eğer dosyamız okuma modunda başarılı bir şekilde açılmışsa aşağıdaki kodlar işlenecektir :

printf("\n\tdeneme.txt dosyasi basariyla okuma modunda acildi.\n");

fscanf(fPointer, "%s %s %d %f", chdizi, chSayilar, &iSayi, &fSayi); // double için %lf

printf("\n\n\tOkunan karakter dizisi : %s\n\tSayilar : %d , %f", chdizi, iSayi, fSayi);

fclose(fPointer);

printf("\n\tDosya basariyla okundu....\n\n");

İlk printf() fonksiyonu ile ekrana

“deneme.txt dosyasi basariyla okuma modunda acildi.”

Mesajı verildikten sonra gelen fscanf() fonksiyonu ile dosyadan okuma işlemi yapılmaktadır.

fscanf(fPointer, "%s %s %d %f", chdizi, chSayilar, &iSayi, &fSayi);

fscanf() fonksiyonunun kullanımı oldukça önemli.

fscanf()  fonksiyonu, ilk parametre olarak hangi dosyadan okuma yapılacaksa o dosya ile ilişkilendirilmiş file pointerı alıyor. Bizim uygulamamız için bu fPointer.

Sonrasında çift tırnak içerisindeki ifadeler ise okuma yapmak istediği değişkenlerin sırasını veriyor. Buradaki değişkenler aynı  %  sabitlerinde olduğu gibi verilmeli. Birer boşlukla ayrılmış şekilde yani. Diğer türlü sıkıntı çıkarıyor .

Mesela chdizi  içerisindeki string ifade de boşluk karakteri varsa boşluğa kadar olan bir ifadeyi string kabul ediyor sonrakiler diğer parametreler içinmiş gibi algılıyor. Bu da saçma sapan şeylerin çıkmasını sağlıyor. Bizim dosyaya kaydettiğimiz ifade aşağıdaki gibiydi.

CProgramlamaDersleri-Dosyaİşlemleri Sayılar: 156 1555.625977

Yani uzun bir string “hepsibitişikhalde” sonrasında bir “Sayılar:” yazısı ve sonrasında bir int değer boşluk ve bir float değer. Şimdi de fscanf() fonksiyonumuza bakalım :

fscanf(fPointer, "%s %s %d %f", chdizi, chSayilar, &iSayi, &fSayi);

"%s %s %d %f", chdizi, chSayilar, &iSayi, &fSayi

İlk String ifade %s ile chdizi’ye aktarılacak. Sonrasındaki %s ise dosyamızdaki “Sayılar:” yazısı için. Bu string değer de chSayilar dizisine aktarılacak. Sonrasında %d sabiti ile gelen integer değer yani  156 int değeri  iSayi değişkenine, %f sabiti ile gelen float değer yani  1555.625977 de fSayi değişkenine atanacak. Durum bundan ibaret.

Programın başında  verdiğim string ifade de hiç boşluk bırakmamamın altında yatan sebep işte bu fscanf() fonksiyonunun kullanımından kaynaklanıyordu.

Uygulamamızın çıktısı ise aşağıdaki gibidir :

Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.

Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.

Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.




Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/13/04/2019/dosya-islemleri-5-c-programlama-dili/
Sort:  

Aynı hem int hem sting vb. tipinde verileri yazabiliyor olmak güzelmiş. Eline sağlık hocam.

Evet hocam hem de diğer fonksiyona nazaran stil de verebiliyor olmamız oldukça kullanışlı olmasını sağlıyor. Teşekkür ederim değerli yorumunuz için.

You got a 11.19% upvote from @minnowvotes courtesy of @etasarim!

Hi, @etasarim!

You just got a 1.7% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.


Bu yazı Curation Collective Discord Sunucusunda küratörlere önerilmiş ve manuel inceleme sonrasında @c-squared topluluk hesabından oy ve resteem almıştır.
This post was shared in the #turkish-curation channel in the Curation Collective Discord community for curators, and upvoted and resteemed by the @c-squared community account after manual review.
@c-squared runs a community witness. Please consider using one of your witness votes on us here

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.

Coin Marketplace

STEEM 0.26
TRX 0.11
JST 0.032
BTC 63510.75
ETH 3065.54
USDT 1.00
SBD 3.82