Dosya İşlemleri #4 – C Programlama Dili

in #tr5 years ago


C programlama dili derslerinin bu dersinde de dosya
işlemleri ile devam ediyoruz. Bir önceki dersimizde “bir karakterlik bir
verinin bir dosyaya yazılması ve okunması” nasıl yapılır, bunu görmüştük.

Bir karakterlik veriyi dosyaya yazmak için fputc / putc() fonksiyonunu ve bir karakterlik veriyi dosyadan okumak için de fgetc() / getc() fonksiyonunu kullandık.

Dosya Okuma ve Yazma İşlemleri

Bu dersimizde dosya okuma ve yazma işlemleri konusu içerisindeki diğer iki ana başlık üzerine konuşacağız:

  • Dosyaya bir karakter dizisinin kaydedilmesi veya dosyadan bir karakter dizisi okunması
  • Dosyaya blok bilgi kaydedilmesi veya dosyadan blok bilgi okunması

Bu başlıklara geçmeden önce bir önceki dersimizin özeti niteliğinde bazı bilgiler vermekte yarar görüyorum:

fputc() fonksiyonunun kullanımında parametre olarak ilk parametreye sabit bir karakter de verebiliriz.

fputc(‘x’ ,  filePointer);

fgetc() fonksiyonunun kullanımında da okunacak olan karakteri char tipinde bir değişkene atamaktansa direk olarak yazdırabiliriz.

printf(“%c”, fgetc(filePointer));

Şimdi de bir dosyayı ekleme (a - append) modunda nasıl açar, istediğimiz veriyi nasıl ekleriz, onu görelim :

Bir önceki dersimizde yapmış olduğumuz uygulamayı biraz modifiye ettim. Bu sebeple uygulamanın sadece değişen kısımları üzerine konuşalım.

Uygulamanın başında diğerinden farklı olarak ekleme yapmak istediğim string ifadenin bildirimini yaptım :

char *chStrEkle = " - etasarim";

chStrEkle değişkeni char tipinde bir pointer değişkendir. “Stringler, aslında karakter dizileridir” mantığına binaen böyle bir bildirim yapılmıştır.

Uygulamanın ekleme yapıldığı bölümde aşağıdaki gibi bir bildirimle karşılaşıyoruz :

fPointer = fopen("deneme.txt","a"); //append modunda açılma

Burada fopen() fonksiyonunu kullanarak deneme.txt dosyasının append yani ekleme modunda açıldığı görülüyor.

Sonrasında gelen if() sorguları dosyanın başarılı açılıp açılmama durumunu sorgulamaktadır.

Dosya başarılı açıldıysa aşağıdaki kodlar işleyecektir. İlk olarak printf() fonksiyonu ile bir mesaj verildikten sonra :

while(*chStrEkle)//String sonu karakteri olmadığı sürece devam et

{

                fputc(*chStrEkle,fPointer);

                chStrEkle++;

}

while döngüsüne giriyoruz. while döngüsünde kontrol işlemi eklemek istediğimiz stringin son karakterine gelinip gelinmediğine göre yapılmaktadır. String karakterinin son karakteri NULL yani sayısal olarak sıfır (0) olduğunda döngü ifade değeri false olacağından döngüden çıkılacaktır.

while blokları içerisinde gördüğümüz

fputc(*chStrEkle,fPointer);

chStrEkle++;

kodları ise normal bir yazma kodundan farksızdır. Ancak dosyamız append modunda açıldığı için yazma işlemi dosyanın son tarafından itibaren yapılacaktır.

Çıktımız ise aşağıdaki gibidir :

Dosyamızı açıp bakalım. Ekleme işlemi düşündüğümüz gibi yapılmış mı?

Görüldüğü gibi sonuç istediğimiz gibidir .

Dosyaya Bir Karakter Dizisinin Kaydedilmesi ve Okunması

Dosyaya veri okuma ve yazma işlemlerinde şimdiye kadar tek karakterlik veriler üzerinde çalıştık. Yani tek karakterlik veri okuma ve tek karakterlik veri yazma (kaydetme). Okuma ve yazma işlemini de 2 fonksiyon üzerinden yaptık. Bu fonksiyonlar her ne kadar tek karakterlik veri okumak ve yazmak için olsa da biz döngüler yoluyla karakter dizilerini okuyabildik veya yazabildik.

fputs() ve fgets() Fonksiyonları

Ancak döngülere gerek kalmadan karakter dizilerini bir fonksiyonla okutabilir veya yazdırabiliriz : fputs() ve fgets()

C dilinde dosyaya karakter dizisi yazdırmak için fputs() fonksiyonu kullanırken, dosyadan karakter dizisi okumak için fgets() fonksiyonu kullanılır.

Yani bu fonksiyonları kullanarak karakter dizilerini tek seferde yazdırabilir ya da okuyabilirsiniz.

  • fputs() fonksiyonunun prototipi aşağıdaki gibidir :

int fputs ( char *cdizi, FILE *fpointer);

fputs() fonksiyonunun çağrılması ise aşağıdaki gibi yapılır :

fputs(karakter_dizisi, filepointer);

  • fgets() fonksiyonunun prototipi ise aşağıdaki gibidir :

char *fgets(char *cdizi, int ivar, FILE * fpointer);

fgets() fonksiyonunun çağrılması ise aşağıdaki gibidir :

fgets(karakter_dizisi, dizi_uzunlugu, filePointer);

Şimdi bu fonksiyonların kullanımını görebileceğimiz bir uygulama yapalım:

Programın başında

#include <string.h>

kodu ile dahil edilen string.h kütüphanesi , main() fonksiyonunda kullanacağımız strcpy() fonksiyonu için include edilmiştir.

main() fonksiyonun başında

FILE *fPointer;

char chdizi[80] = "Bu bir karakter dizisidir. C Programlama Dili Dersleri";

bildirimleri ile FILE tipinde adı fPointer olan bir dosya göstericisi tanımlanmıştır. Sonrasında gelen kod ile de char tipinde adı chdizi[] olan 80 karakterlik bir karakter dizisi tanımlanıp ilk değer ataması yapılmıştır.

Sonrasında gelen kod ile de

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

fopen() fonksiyonu ile yazma modunda açılan deneme.txt dosyasının adresi fPointer ile ilişkilendirilmiştir.

Sonraki if() yapıları ise fopen() fonksiyonu ile dosyanın başarılı açılıp açılmadığı sorgusunu yapmaktadır.

Eğer deneme.txt dosyası yazma modunda başarılı bir şekilde açılmışsa else bloğu içerisindeki kodlar çalışacaktır :

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

fputs(chdizi,fPointer);

printf("\n\tYazilan karakter dizisi : %s\n",chdizi);                       

fclose(fPointer);

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

bu kodlarla ilk olarak printf() fonksiyonu ile kullanıcıya dosya yazma modunda açıldı bilgisi verildikten sonra fputs() fonksiyonu ile  chdizi içerisindeki veriler fPointer ile işaret edilen dosyaya yazılacaktır.

Görüldüğü gibi öncesinde bir döngü ile yapmış olduğumuz işlem fputs() fonksiyonu sayesinde tek satırda halledilmiş oldu.

Sonrasında fclose() fonksiyonu ile dosyamız kapatılmış ve kullanıcıya printf() fonksiyonu ile gereken mesaj verilmiştir.

Buraya kadar yapılan string bir ifadeyi dosyaya yazma işlemidir.

Uygulamamızın diğer kısmı ise dosyadan string bir ifadenin okunması üzerine kurulmuştur.

Dosyadan okunan string ifadeyi  chdizi[] adındaki karakter dizisine kopyalayacağımız için okuma işlemine başlamadan önce chdizi[] içeriğini boşaltmamız gerekiyor.

Daha önceki derslerimizden biliyoruz ki, karakter dizilerinin ilk değer atamasından sonra normal yollarla değerinin değiştirilmesi imkansızdı. Bu sebeple biz burada strcpy() fonksiyonunu kullanacağız.

strcpy(chdizi, "");

kodu ile strcpy() fonksiyonunu kullanarak chdizi içeriğine boş bir string kopyalıyoruz. Sonrasında gelen

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

fonksiyonu ile de chdizi[] içeriğini ekrana kontrol amaçlı yazdırıyoruz.

Gelelim dosyadan string ifade okuma işlemine.

Bir dosya üzerinde herhangi bir işlem yapmadan önce o dosyanın ilk önce açılması gerekiyor.

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

kodu ile deneme.txt dosyasının read yani okuma modunda açıyoruz.

Sonrasında gelen if() sorguları ise dosyamızın okuma modunda başarılı açılıp açılmadığını sorgulamaktadır. Dosyamız başarılı bir şekilde açılmışsa aşağıdaki kodlar işlenecektir :

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

fgets(chdizi, 80, fPointer);

printf("\n\n\tOkunan karakter dizisi : %s",chdizi);

fclose(fPointer);

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

İlk satırdaki printf() fonksiyonu ile kullanıcıya dosyanın başarılı bir şekilde açıldığı bilgisi verildikten sonra gelen fgets() fonksiyonu ile fPointer dosya göstericisinin işaret ettiği dosyanın içerisindeki  string ifadenin 80 karakteri chdizi karakter dizisine kopyalanmaktadır.

Sonrasındaki printf() fonksiyonu ile dosyadan okunan string ifade ekrana yazdırılıp fclose() fonksiyonu ile dosya kapatılmaktadır.

Çıktımız 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/12/04/2019/dosya-islemleri-4-c-programlama-dili/
Sort:  

Hi, @etasarim!

You just got a 1.75% 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.

Üni yıllarım aklıma geldi (: şunları yapamadığım, pc ile boş bakışmalarımız 🙈 ama biraz kavrayınca çok zevkli bir ders olduğu ... Ufak tefek birşeyler yapınca gökten üzerime yağan özgüven falan 😄 Yorumum içerikle tamamen alakasız galiba 🙈 Anı hatırlatma için özellikle teşekkür ederim😄

Rica ederim hocam ben teşekkür ederim yorumunuzla renk kattınız. Hangi bölüm okumuştunuz merak ettim yorumunuzu okuyunca. Üzerinde dursaydınız eminim ki rahatlıkla yapardınız.

Ben rica ederim (: bilgisayar programlama okudum. Delphi de yapıyorduk bunları galiba 🙈 pascal vardı, c++ falan. 😏 Kesinlikle üzerinde durmadım, ama durulması gerekiyormuş. Pişmanlıklar pişmanlıklar ...
😐

Vay hocam hiç beklemiyordum, daha çok sanatvari bir havanız var. Bilgisayar sanki bana o yönü zayıf insanların ilgileneceği bir şeymiş gibi geliyor nedense :) Kendimden böyle bir sonuç çıkardım sanırım. :)

((: sonuca katılmadım desem ... Haksızlık edersiniz kendinize belki ilgilenecek zamanınız olmadı, belki ilgi alanınız çok daha ileri düzeyde henüz ilginize layık bir şeyle karşılaşmadınız. (: bilgisayar da gerek teknik bilgi gerekse yazılım da ne kadar körelmiş olsam da yine de seviyorum ben (: tüm alanlarda böyledir ama özellikle matematik ve bilgisayar da çözümsüz hiç bir şey yoktur. Sorunların veya soruların mutlaka bir çözüm yolu vardır...
Hayatı özellikle bilgisayar ya da matematik gibi görürüm bundan ötürü .neyse konu sapmasın 🙈 aslında zayıf yön yoktur, ilgilenilmemiş ilgi alanlarımız vardır 🤗

Anladım hocam, olaylara cidden pozitif bakan bir havanız var. Böyle sürekli motivasyonu yüksek insanlar vardır ya öyle sizinkisi. Dediğiniz gibi olsun o zaman :) Teşekkür ederim sohbet için. Arada yazışalım böyle.

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

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

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


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 64555.14
ETH 3086.03
USDT 1.00
SBD 3.85