Sorunun Tarihi:
C dilinde dosyalarla çalışma; dilin erken uygulamalarında ortaya çıkan temel bir beceridir. C dilinin standart kütüphanesi (stdio.h), giriş-çıkış akışlarıyla çalışmak için taşınabilir programlar oluşturmaya yardımcı olan evrensel fonksiyonlar sunar.
Sorun:
Genellikle yeni başlayan programcılar dosya akışlarıyla çalışma sırasında hata yaparlar: dosyaları açmanın sonucunu kontrol etmezler, bellek yönetimini yanlış yaparlar, okuma veya yazma hatalarını işleme almazlar. Dosyaların kapatılmasındaki hatalar kaynak sızıntılarına yol açarken, tamponlarla yanlış çalışma veri kaybına neden olabilir.
Çözüm:
Dosyalarla doğru çalışmak için her zaman:
fopen ile açmak;fread, fwrite, fscanf, fprintf fonksiyonlarını kullanmak;fclose ile kapatmak gerekir.Kod örneği:
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("Dosya açılamadı"); return 1; } fprintf(fp, "Merhaba, dünya! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Okuma için dosya açma hatası"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Önemli noktalar:
Bir dosya birden fazla kez fclose ile kapatılabilir mi?
Hayır, dosya akışını çift kapatmak tanımsız bir davranışa neden olur. fclose işleminden sonra, tanımlayıcı geçersiz hale gelir.
fread fonksiyonu dosyanın sonuna ulaştığında ne döner?
fread başarıyla okunan elemanların sayısını döner. Dosyanın sonuna ulaşıldığında dönen sayı beklenenden daha az olabilir. Her zaman feof ve ferror kontrol edilmeli ve tanı koyma için kullanılmalıdır.
Aynı dosya akışını aynı anda hem yazma hem okuma için kullanabilir miyiz?
Mümkündür, eğer dosya "r+" veya "w+" modunda açılmışsa, ancak yön değiştirmeden (yazma/okuma) önce fflush veya dosya konumunu değiştiren başka bir işlem (fseek) çağrısı yapılmalıdır. Aksi takdirde davranış tanımsızdır.
fclose işleminden sonra aynı FILE * göstericisinde çalışmaya devam etmek.fflush çağrılmadı, akış kapatılmadı).Bir geliştirici, fopen'dan dönen değeri kontrol etmeden günlük dosyasına veri yazıyordu. Tanımlayıcılar tükenince dosya bir daha açılamadı — günlük mesajları kayboldu.
Artılar:
Eksiler:
Kodun başka bir versiyonunda her zaman tüm dönen değerler kontrol edildi (fopen, fwrite, fclose). Hata meydana geldiğinde, perror aracılığıyla ayrıntılı bir tanılama mesajı yazdırıldı ve program düzgün bir şekilde sonlanarak kaynaklar serbest bırakıldı.
Artılar:
Eksiler: