Programlama Temelleri

11 - Dosya İşlemleri

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2024

Dosya İşlemleri: Verileri Kalıcı Kılmak

  • Programlar genellikle verileri RAM’de geçici olarak saklar. Program sonlandığında bu veriler kaybolur.
  • Dosya işlemleri, verileri kalıcı olarak dosyalarda saklamamızı sağlar.
  • Bu sayede, program kapandıktan sonra bile verilere erişebilir ve tekrar kullanabiliriz.

Dosya Türleri

  • Metin Dosyaları: İnsan tarafından okunabilir karakterlerden oluşur. (Örnek: .txt, .csv)
  • İkili Dosyalar: Bilgisayarın doğrudan okuyabileceği formattadır. (Örnek: .bin, .dat, resimler, müzikler)

Bu derste, metin dosyaları ile çalışacağız.

Dosyaları Açma ve Kapatma: fopen() ve fclose()

  • Bir dosyayla işlem yapabilmek için öncelikle dosyayı açmamız gerekir. Bunun için fopen() fonksiyonu kullanılır.
  • İşlemimiz bittiğinde, dosyayı fclose() fonksiyonu ile kapatmalıyız.

Not: C dilinde dosya işlemleri için stdio.h başlık dosyası kullanılır.

fopen() Fonksiyonu

Sözdizimi:

FILE *fopen(const char *dosya_adı, const char *mod);

Örnek:

FILE *dosya = fopen("veri.txt", "w");

Dosya Açma Modları

  • "r": Okuma modu (dosya yoksa hata).
  • "w": Yazma modu (dosya yoksaoluşturur, varsa siler).
  • "a": Ekleme modu (dosya yoksaoluşturur, varsa sonuna ekler).
  • "r+": Hem okuma hem yazma (dosyayoksa hata).
  • "w+": Hem okuma hem yazma (dosyayoksa oluşturur, varsa siler).
  • "a+": Hem okuma hem ekleme (dosyayoksa oluşturur, varsa sonuna ekler).

Dosya açma işlemi başarılı olursa, dosya işaretçisi (FILE *) döndürülür. Başarısız olursa NULL döner.

Örnek:

FILE *dosya = fopen("veri.txt", "w");

fclose() Fonksiyonu

Sözdizimi:

int fclose(FILE *dosya_isaretcisi);
  • dosya_isaretcisi: Kapatılacak dosyanın işaretçisi.

Örnek: Dosya Açma ve Kapatma

#include <stdio.h>

int main() {
  FILE *dosya = fopen("veri.txt", "w"); // Yazma modunda aç

  if (dosya == NULL) {
    printf("Dosya açılamadı!\n");
    return 1; // Hata durumunda programdan çık
  }

  // ... dosya işlemleri ...

  fclose(dosya);
  return 0;
}

Dosyalara Yazma: fprintf() Fonksiyonu

  • fprintf() fonksiyonu, printf() fonksiyonuna benzer, ancak verileri ekrana yazdırmak yerine dosyaya yazar.

Sözdizimi:

int fprintf(FILE *dosya_isaretcisi, const char *format, ...);
  • dosya_isaretcisi: Yazılacak dosyanın işaretçisi.
  • format: Yazdırma formatı (printf() gibi).
  • ...: Yazdırılacak değişkenler.

Örnek: Dosyaya Yazma

#include <stdio.h>

int main() {
  FILE *dosya = fopen("veri.txt", "w");

  if (dosya == NULL) {
    printf("Dosya açılamadı!\n");
    return 1;
  }

  int sayi = 10;
  fprintf(dosya, "Sayı: %d\n", sayi);

  fclose(dosya);
  return 0;
}

Dosyalardan Okuma: fscanf() ve fgets() Fonksiyonları

  • fscanf() fonksiyonu, scanf() fonksiyonuna benzer, ancak kullanıcıdan girdi almak yerine dosyadan biçimlendirilmiş veri okur.
  • fgets() fonksiyonu ise, dosyadan bir satır metni okur. scanf() fonksiyonundan daha güvenlidir, çünkü arabellek taşmasını önler.

fscanf() Fonksiyonu

Sözdizimi:

int fscanf(FILE *dosya_isaretcisi, const char *format, ...);
  • dosya_isaretcisi: Okunacak dosyanın işaretçisi.
  • format: Okuma formatı (scanf() gibi).
  • ...: Okunacak değişkenlerin adresleri.

fscanf() fonksiyonu, dosyadan veri okurken format belirteçlerini kullanır. Dosyada belirtilen formata uygun bir veri bulursa, bu veriyi değişkenlere atar ve başarıyla okunan değişken sayısını döndürür.

Dosya sonuna ulaşırsa veya okuma hatası oluşursa, EOF değerini döndürür.

Örnek: fscanf() ile Dosyadan Okuma

#include <stdio.h>

int main() {
  FILE *dosya = fopen("veri.txt", "r");
  int sayi;

  if (dosya == NULL) {
    printf("Dosya açılamadı!\n");
    return 1;
  }

  while (fscanf(dosya, "%d", &sayi) != EOF) { // Dosya sonuna kadar oku
    printf("Okunan sayı: %d\n", sayi);
  }

  fclose(dosya);
  return 0;
}

fgets() Fonksiyonu

Sözdizimi:

char *fgets(char *str, int n, FILE *stream);
  • str: Okunan metnin kaydedileceği karakter dizisi.
  • n: Okunacak maksimum karakter sayısı (null karakteri dahil).
  • stream: Dosya işaretçisi.

Örnek: fgets() ile Dosyadan Satır Okuma

#include <stdio.h>

int main() {
  FILE *dosya = fopen("metin.txt", "r");
  char satir[100];

  if (dosya == NULL) {
    printf("Dosya açılamadı!\n");
    return 1;
  }

  while (fgets(satir, sizeof(satir), dosya) != NULL) {
    printf("%s", satir);
  }

  fclose(dosya);
  return 0;
}

EOF (End of File)

  • EOF (End Of File - Dosya Sonu), dosya okuma fonksiyonları tarafından dosya sonuna ulaşıldığında döndürülen özel bir değerdir.
  • fgets() fonksiyonu, dosya sonuna ulaşırsa NULL döndürür.
  • fscanf() fonksiyonu, dosya sonuna ulaşırsa EOF döndürür.
  • Döngülerde dosya sonunu kontrol etmek için bu değerleri kullanırız.

Alıştırmalar

  1. Kullanıcıdan adını ve yaşını alarak “isim.txt” adlı bir dosyaya yazan bir program yazın.
  2. “sayilar.txt” adlı bir dosyada bulunan tam sayıları okuyarak toplamlarını hesaplayan ve ekrana yazdıran bir program yazın. Her satırda bir sayı olduğunu varsayın.
  3. Klavyeden girilen metni “notlar.txt” adlı bir dosyaya yazan bir program yazın. Kullanıcı “çıkış” yazdığında program sonlansın ve dosya kapansın.
  4. “ogrenciler.txt” adlı bir dosyada her satırda bir öğrenci adı olduğunu varsayarak, dosyadaki öğrenci sayısını bulan bir program yazın.
  5. “veri.txt” adlı dosyanın ilk satırını okuyup ekrana yazdıran bir program yazın.

Özet

  • fopen(): Dosya açar.
  • fclose(): Dosya kapatır.
  • fprintf(): Dosyaya yazar.
  • fscanf(): Dosyadan okur.
  • fgets(): Dosyadan satır okur.
  • EOF: Dosya sonu.