Professional Documents
Culture Documents
C Ile Dosya Işlemleri
C Ile Dosya Işlemleri
ONSATIR.C:
================================================================
#include <stdio.h>
main()
{
FILE *fp;
char ivir[25];
int index;
fp = fopen("onsatir.txt","w"); /* yazmak icin açalım */
strcpy(ivir,"Bu bir ornek satirdir.");
for (index = 1;index <= 10;index++)
fprintf(fp,"%s Satir no: %d\n",ivir,index);
fclose(fp); /* dosyayı kapayalim */
}
================================================================
Bir dosyaya yazan ilk programımız. Her zamanki gibi, "stdio.h" i programa
ekliyoruz, ve daha sonra cok tuhaf bir degisken tanımlıyoruz.
DOSYA YOLU
Dosyaya ulaşmak için diskin başından beri geçilen yola dosya yolu diyoruz.
Örneğin, masa üstünüzde bulunan ve "beni.oku" ismindeki bir dosyaya giden yol, C
dilinde
Windows altında şu şekilde yazılabilir: "C:\\Users\\ben\\Desktop\\beni.oku"
(Windows'da dosya yolu ters bölü işaretleriyle yazılmaktadır. Hatırlarsanız C dilinde
ters bölünün özel bir anlamı vardır; bu nedenle ikişer tane konması gereklidir.)
Linux altında ise aynı yol şu şekilde yazılabilir: "/home/ben/Desktop/beni.oku"
Yukarıdaki örnekte gibi bir yol belirtmezseniz, sadece dosyanın ismini yazarsanız,
programınız hangi klasörde çalıştırılırsa, dosya da o klasörde yaratılır.
DOSYANIN AÇILMASI
Bir kutuge yazmadan once, onu açmamız gereklidir. Açmak demek, sisteme o
dosyanın ismini bildirmek, ve yazmak veya okumak istedigimizi belirtmektir. Bunu,
"fopen" fonksiyonu ile yapiyoruz. "fp" isimli dosya pointer'i, bu açılan
dosyaya ait bazi bilgileri tutar. "fopen" ise, iki parametre gerektirir.
Birincisi, dosyanın ismidir. Linux kullanıyorsanız, işletim sistemi büyük küçük harf
ayrımı yapar.
Yani dosyayı yaratırken küçük harfle yarattıysanız, tekrar erişirken de küçük harfle
açmanız gerekecektir.
OKUMAK "r"
"fopen" in ikinci parametresi ise, acilacak dosya ile ne yapilacagini belirtir. Buraya,
"r" "w" yada "a" yazabiliriz. "r" kullanildiginda, kutugun okuma icin acilacagini
belirtir. "w", kutuge yazilacagini, ve "a" ise zaten var olan bir kutuge bilgi
ekleyeceginizi belirtir. Bir dosyayı okumak icin açmak icin, o kutugun diskte var
olmasini geretirir. Şayet dosya yok ise, "fopen", geriye NULL degerini dondurur.
YAZMAK "w"
Bir dosya yazmak icin acilinca, sayet diskte yoksa yaratilir, sayet varsa, icindeki
bilgiler silinir.
EKLEMEK "a"
Bir dosya eklemek modunda acildiginda, sayet yoksa yaratilir, varsa, veri giris
pointer'i bu kutugun sonuna ayarlanir. Bu sayede yeni bilgi yazilinca, kutugun sonuna
yazilmis olur.
DOSYAYA YAZMAK
Bir dosyaya yazmak, ekrana yazmak ile neredeyse aynidir. En onemli farklar,
yeni fonksiyon isimleri, ve dosya pointer'inin bu fonksiyonlara parametre
olarak eklenmesidir. Ornek programda, "fprintf" komutu "printf" komutunun
yerini alir.
DOSYAYI KAPATMAK
Bir dosyayı kapatmak icin, sadece "fclose" komutunu kullanmak yeterlidir. Parametre
olarak da dosyanın pointer'ini gecirmek yeterlidir. İşletim sistemi, program sona
erince kullandigi dosyaları kapattigindan, "fclose" u kullanmak sart degildir, fakat bir
aliskanlik yapmasi icin, kullandiginiz dosyaları kapatmanizi tavsiye ederim.
Bu program iki tane iç içe döngüden olusuyor. Dıştaki dongu, sadece birden
ona kadar sayiyor.. Içindeki dongu ise, yazilan karakter sıfır olmadigi
surece, "putc" fonksiyonunu cagirir.
"putc" FONKSIYONU
Dış dongu on kere tekrarlandiktan sonra, program dosyayı kapatip sona eriyor. Bu
program calistiktan sonra dosyayı incelerseniz, gercektende sonuna 10 satir
eklendigini gorursunuz.
BIR DOSYAYI OKUMAK
KAROKU.C:
=============================================================
===
#include <stdio.h>
main()
{
FILE *dosya;
int c;
dosya = fopen("onsatir.txt","r");
if (dosya == NULL) printf("Boyle bir dosya yok\n");
else {
do {
c = getc(dosya); /* Bir karakter oku */
putchar(c); /* ekranda goster */
} while (c != EOF); /* Dosya sonuna (END OF FILE) a kadar devam */
}
fclose(dosya);
}
================================================================
Program, bir "do while" dongusunun icinde tek bir karakter okuyup, ekrana
yaziyor. Bu dongu, ta ki, "getc" fonksiyonu dosyanın sonunu belirten EOF
dondurene kadar surer. EOF donunce de, dosya kapatilir, ve program sona
erer.
Buna mani olmak icin, bir baska program gorelim. Ismi IYIOKU.C olsun:
IYIOKU.C:
=============================================================
===
#include "stdio.h"
main()
{
FILE *fp1;
char birkelime[100];
int c;
fp1 = fopen("onsatir.txt","r");
do {
c = fscanf(fp1,"%s",birkelime); /* dosyadan bir kelime oku... */
if (c != EOF)
printf("%s\n",birkelime); /* ekrana yaz... */
} while (c != EOF); /* ta ki EOF olana dek.. */
fclose(fp1); /* dosyayı kapa */
}
================================================================
Gordugunuz gibi, bir "if" komutu ile, sayet dosyanın sonuna gelip
gelmedigimize bakiyoruz. Aslinda bu problem KAROKU.C da da vardi, fakat
orada pek gorunmuyordu.
=============================================================
===
Bazi yeni derleyicilerin, "stdprn" diye, onceden tanimli bir dosya tanimliyicilari
vardir. Bu sayede, siz printer'i bir dosya gibi açmadan, ona veri yollayabilirsiniz.
Program, birer birer butun dosyayı okuyup, ekranda gosterir, ve printer'e yollar. EOF ,
dosya sonu bulundugunda, dosyalar kapanir, ve program biter.
Bazen dosyaya bilgileri olduğu gibi yazmak, ve hatta ASCII kodları 0-31 yada 127-
255 arası bilgiler girmek isteyebilirsiniz. Bunlara binary bilgiler denir. Örneğin bir
programın derlenmiş hali, bir MP3 parça yada bir JPG resim binary verilere örnektir.
Bir dosyayı "binary" olarak açmak isterseniz, bunu fopen() a bildirmeniz gereklidir.
Bunu da fopen'ın ikinci parametresine "b" harfini ekleyerek yapabilirsiniz. "rb" yada
"wb" gibi örneğin.
Bunları okumak için C de "fread" kullanılır, yazmak için ise "fwrite" kullanılır. İki
fonksiyon da veri blokları ile çalışır yani bellekten arka arkaya kısımları okur yada
yazar. Genelde array (dizin) ler kullanılır. Bunlara parametre olarak adres
girildiğinden, dilerseniz pointer geçirebilirsiniz yada daha sonra göreceğimiz
structure ları bile diske bunlarla yazabilir yada okuyabilirsiniz.
Tanımı:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements,
FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t
number_of_elements, FILE *a_file);
Buradaki void *ptr lafı, herhangi bir cins pointer konabileceği belirtilmek için
konmuştur, karakter pointer yada integer pointer gibi. fread'in 4 parametresi vardır.
Birincisi, sizin dizinin (array) adresidir. İkincisi, dizinin her elemanının boyudur.
Üçüncü ise, dizide kaç tane eleman olduğudur. Sonuncu parameter ise malum dosya
pointer'ımızdır.
Örnek:
================================================================
#include <stdio.h>
main() {
FILE *fp;
char x[10]="ABCDEFGHIJ";
fp=fopen("c:\\test.bin", "wb");
fwrite(x, sizeof(x[0]), 10, fp);
fclose(fp);
}