C Programlama Dilinde Dosya İşlemleri

  • 12-06-2020 03:57
  • 161

C programlama dilinde dosya işlemleri için farklı kitaplıklar farklı fonksiyonlar kullanılabilir. Burada inceleyeceğimiz standart kitaplık içinde bulunan standart fonksiyonlardır. Bu fonksiyonlar fopen, fwrite, fread, fclose. C'de dosya işlemleri temel düzeyde şu sıra yapılır: önce işlem yapılacak dosya fopen fonksiyonu ile açılır (ya da oluşturulur) daha sonra dosyadan veri okunacaksa fread, dosyaya veri kaydedilecekse fwrite fonksiyonu kullanılır. İşlem tamamlandıktan sonra dosya fclose fonksiyonu ile kapatılır. Bu işlemler sırasında oluşacak hatalar ise stderr akışına kaydedilir. C'de dosya işlemleri ilk başta karmaşık gibi görünebilir ama tecrübe kazandıkça işlemlerin temel düzeyde olmasının avantajlarını kullanabilirsiniz.

fopen Fonksiyonu

Fonksiyon tanımı:

FILE * fopen( const char * dosya, const char * mod );
 
 

w: Yeni bir dosya oluştumak veya varolan dosyayı hem veri okumak hem de veri yazmak için açılacağı anlamına gelir.
r: Dosyanın yanlızca veri okumak için açılacağı anlamına gelir.
a: Varolan dosyaya ekleme yapılacağı anlamına gelir.
+: Harflerden sonra kullanılan artı işareti dosyanın güncellenebileceği anlamına gelir.
b: 'b'yazıldığında dosya açma modu ikili (binary) mod yazılmadığında ise text modu geçerli olur. Eğer dosya text dosyası değilse ikili mod kullanılmalı. Bu mod kullanılmazsa dosya okuma sırasında EOF (dosya sonu) karakterinin bulunduğu noktaya kadar okuma yapabilir bu da program içinde öngörülemez hatalara neden olabilir.

Dönüş değeri: fopen fonksiyonu FILE yapsında bir pointer döndürür. Daha sonra dosya üzerinde yapılacak işlemlerde bu pointer kullanılır. Dosya bulunamzsa ya da oluşturulamazsa NULL döndürür.

fopen Fonksiyon Örnekleri:

test.txt dosyası C diskinin ana dizininde oluşturuluyor ve dosyaya yazmak için dosya text modunda açılıyor. Dikkat edilmesi gereken bir nokta dosya eğer varsa üzerine yazılır ve eski veriler kaybolur. Ayrıca C'de string tanımlarken ters slaş için çift ters slaş kullanılır.

fopen("C:\\test.txt","w");
 
 
fopen("test.dat","rb");
 
 
fopen("test.dat","a+b");

fwrite Fonksiyonu

 

Fonksiyon tanımı:

size_t fwrite ( const void * veri, size_t veri_tipi_uzunlugu, size_t veri_uzunlugu, FILE * dosya );
 


veri: Dosyaya kaydedilecek verinin adresi.
veri_tipi_uzunlugu: Verinin tanımlandığı veri tipinin uzunluğu. sizeof(veri_tipi) oparatörü ile veri tipi uzunluğu bulunabilir.
veri_uzunlugu: Doayaya yazılmak istenen veri uzunluğu.
dosya: fopen fonksiyonu ile açılmış dosya işaretçisi.

Fonksiyonun dönüş değeri int tipinde dosyaya kaydedilen veri miktarı. Bayt cinsinden veri uzunluğunu bulmak için veri, veri tipi uzunluğu ile çarpılmalı.

fwrite Fonksiyon Örneği

#include <stdio.h>
#include <string.h>


int main(void){
	//Dosyaya kaydedilecek veri.
	const char * veri="C programlama dilinde dosya işlemleri nasıl yapılır.";
	//Oluşturulacak dosyanın kaydedileceği değişken.
	FILE * dosya;
	//Dosyaya kaydedilen veri miktarı.
	int kaydedilen=0;

	//test.dat isminde bir dosya oluşturuluyor ve 
	//dosyaya yazmak için açılıyor.
	dosya=fopen("test.txt","w");

	//İşlemin doğruluğu kontrol ediliyor.
	if(dosya==NULL){
		printf("Dosya oluşturulamadı. Hata: %s",stderr);
		return 0;
	}

    //Dosyaya veri kaydediliyor. 
    //strlen() fonksiyonu string uzunluğunu bayt cinsinden bulmak için kullanılıyor.
	kaydedilen=fwrite(veri,1,strlen(veri)+1,dosya);
	
	//Kaydedilen veri miktarı ekrana yazdırılıyor.
	printf("Dosyaya %d bayt veri kaydedildi.",kaydedilen);

	//Dosya kapatılıyor.
	fclose(dosya);

	return 0;
}

 

fread Fonksiyonu

Fonksiyon tanımı:

size_t fread ( void * veri, size_t veri_tipi_uzunlugu, size_t veri_uzunlugu, FILE * dosya );
fopen fonksiyonu ile açılmış dosyadan veri okuyan standart bir fonksiyondur. Fonksiyon 4 farklı parametre alır. Parametreler ve kullanımları:

veri: Dosyadan okunacak verinin kaydedileceği adres.
veri_tipi_uzunlugu: Okunacak verinin veri tipinin bayt cinsinden uzunluğu.
veri_uzunlugu: Okunacak verinin miktarı.
dosya: fopen fonksiyonu ile açılmış dosya işaretçisi.

Fonksiyonun dönüş değeri int olarak okunan veri mikterı.

fread Fonksiyon Örneği

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
	Bu örnek bir önceki örnekle oluşturulan test.txt dosyasını kullanır.
	Eğer dosya yoksa manuel olarak aynı klasörde test.txt isminde bir text dosyası oluşturup 
	içerisine bir şeyler yazarak test edebilirsiniz.
*/

int main(void){
	//Açılan dosya için kullanılacak pointer.
	FILE * dosya;
	//Okunacak verinin kaydedileceği değişken.
	char * veri;
	//Dosyadan okunacak veri uzunluğu.
	int veri_uzunlugu=40;
	int okunan=0;
	const char * dosya_adi="test.txt";
 
	//Dosya okumak için ikili modda açılıyor.
	dosya=fopen(dosya_adi,"r");

	//Dosyanın doğru şekilde açıldığı kontrol ediliyor.
	if(dosya==NULL){
		printf("Dosya açılamadı.");
		return 0;
	}

	//Okunacak veri için bellekten yer ayrılıyor.
	veri=(char *)malloc(veri_uzunlugu);

	//İşlemin doğruluğu kontrol ediliyor.
	if(veri==NULL){
		//Bellek hatası.
		printf("Bellek hatası oluştu.\n");
		//Dosya kapatılıyor.
		fclose(dosya);
		//Programdan çıkılıyor.
		return 0;
	}

	//Dosyadan veri okunuyor.
	okunan=fread(veri,1,veri_uzunlugu,dosya);

	//Okunan verinin son baytı 0 değilse 0 yapılıyor.
	//Bu sayede string olarak sınırlandırılıyor.
	if(okunan>0){
		if(veri[okunan-1]!=0){
			veri[okunan-1]=0;
		}
	}

	//Okunan veri ekrana yazdırılıyor.
	printf("Okunan veri: %s\n",veri );
	//Bilgilendirme mesajı ekrana yazdırılıyor.
	printf("%s dosyasından %d bayt okundu.\n",dosya_adi,okunan);

	//Dosya kappatılıyor.
	fclose(dosya);

	//Ayrılan bellek sisteme geri veriliyor.
	free(veri);

	//Programdan çıkılıyor.
	return 0;

}

 

fclose fonksiyonu


fopen ile açılmış dosyayı kapatır. Açtığımız dosyalarla işimiz bittikten sonra fclose fonksiyonu ile kapatmalıyız.
Kullanımı fclose(dosya); şeklindedir.