LuvyAI — Ücretsiz başla. 18+

🚀 BAŞTAN SONA C DİLİ BÖLÜM-10: Dosya İşlemleri (File I/O) ve Kalıcı Veri Yönetimi 📁

Konu Özeti

C dilinde dosya işlemleri (File I/O) kullanılarak verilerin diskte kalıcı olarak saklanması anlatılıyor. FILE pointer'ı, dosya açma modları (r, w, a, rb, wb), fprintf/fscanf ile metin tabanlı okuma-yazma ve fwrite/fread ile ikili (binary) dosya yönetimi örneklerle açıklanıyor. Ayrıca dosya sonu kontrolü (feof) ve hata yönetimi ele alınıyor.

🚀 BAŞTAN SONA C DİLİ BÖLÜM-10: Dosya İşlemleri (File I/O) ve Kalıcı Veri Yönetimi 📁

Selamlar! Serimizin 10. bölümüne hoş geldiniz.

Önceki bölümde verileri gruplamamızı sağlayan `struct` yapısını, `typedef` kullanımını, pointer bağlantılarını ve `union` kavramını incelemiştik. Şu ana kadar yazdığımız tüm programlarda veriler RAM'de (geçici bellekte) tutulduğu için program kapandığında kayboluyordu. Bu bölümde verilerimizi disk üzerinde dosyalarda **kalıcı (persistent)** olarak saklamamızı sağlayan **Dosya İşlemlerini (File Input/Output)** öğreneceğiz.

---

📌 1. Dosya İşlemlerine Giriş ve `FILE` Pointer'ı 📄

C dilinde dosya işlemleri yapmak için standart kütüphanede (`<stdio.h>`) yer alan özel bir işaretçi türü olan **`FILE*` (FILE Pointer)** kullanılır.

Dosya İşlemlerinin 3 Temel Adımı:
1. **Dosyayı Açma (`fopen`):** Dosya diske bağlanır ve mod seçilir.
2. **Okuma / Yazma İşlemleri:** Veri akışı sağlanır.
3. **Dosyayı Kapatma (`fclose`):** Bellek tamponları temizlenir ve dosya güvenle kapatılır.

---

🔓 2. Dosya Açma Modları (File Modes) 🔑

Dosya açılırken hangi amaçla açılacağı belirtilmelidir:

| Mod | Açıklama | Dosya Yoksa? |
| :--- | :--- | :--- |
| `"r"` | **Read (Okuma):** Var olan dosyayı okur. | `NULL` döner (HATA). |
| `"w"` | **Write (Yazma):** Sıfırdan dosya açar. İçerik varsa **SİLER!** | Yeni dosya oluşturur. |
| `"a"` | **Append (Ekleme):** Dosya sonuna veri ekler. İçerik korunur. | Yeni dosya oluşturur. |
| `"rb"` / `"wb"` | İkili (Binary) formatta okuma / yazma modları. | İkili mod geçerlidir. |

---

✍️ 3. Dosyaya Veri Yazma: `fprintf` ve `fputs` 📝

### A. `fprintf()` İle Biçimlendirilmiş Yazma:
Konsola çıktı bastığımız `printf` fonksiyonunun aynısıdır; sadece ilk parametre olarak `FILE*` almaktadır.

#include <stdio.h>

int main() {
// 1. Adım: Dosyayı Yazma Modunda ("w") Açıyoruz
FILE *dosya = fopen("ogrenciler.txt", "w");

// Güvenlik Kontrolü: Dosya açılabildi mi?
if (dosya == NULL) {
printf("HATA: Dosya olusturulamadi!\n");
return 1;
}

// 2. Adım: Dosyaya Veri Yazma
fprintf(dosya, "%d %s %.2f\n", 101, "Ahmet", 3.45);
fprintf(dosya, "%d %s %.2f\n", 102, "Ayse", 3.80);

printf("Veriler dosyaya basariyla yazildi! ✅\n");

// 3. Adım: Dosyayı Kapatma
fclose(dosya);

return 0;
}

---

📖 4. Dosyadan Veri Okuma: `fscanf`, `fgets` ve `feof` 🔍

Dosyadan veri okurken dosya sonuna gelinip gelinmediğini kontrol etmek için **`feof(dosya)` (File End Of File)** fonksiyonu kullanılır.

#include <stdio.h>

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

if (dosya == NULL) {
printf("HATA: Okunacak dosya bulunamadi!\n");
return 1;
}

int numara;
char isim[50];
float ortalama;

printf("--- DOSYADAN OKUNAN VERILER ---\n");

// fscanf okuma yaptıkça geriye okunan eleman sayısını döner
while (fscanf(dosya, "%d %s %f", &numara, isim, &ortalama) != EOF) {
printf("No: %d | Isim: %-10s | Ort: %.2f\n", numara, isim, ortalama);
}

fclose(dosya);
return 0;
}

---

💾 5. İkili (Binary) Dosya İşlemleri: `fwrite` ve `fread` ⚙️

Metin dosyaları (`.txt`) insan tarafından okunabilir veriler saklarken, `.bin` veya `.dat` uzantılı ikili (binary) dosyalar `struct` verilerini doğrudan bellek blokları halinde diske ham (raw) olarak yazar ve okur. Bu işlem metin dosyalarına göre katbekat hızlıdır.

• **`fwrite(ptr, boyut, adet, dosya)`:** Bellekteki bloğu dosyaya yazar.
• **`fread(ptr, boyut, adet, dosya)`:** Dosyadaki bloğu belleğe okur.

#include <stdio.h>

typedef struct {
int id;
char urunAdi[30];
double fiyat;
} Urun;

int main() {
Urun u1 = {5001, "Mekanik Klavye", 1250.0};

// --- 1. BINARY YAZMA ---
FILE *fout = fopen("urunler.bin", "wb"); // wb = write binary
if (fout != NULL) {
// u1 yapısının tüm bellek bloğunu doğrudan dosyaya yazıyoruz
fwrite(&u1, sizeof(Urun), 1, fout);
fclose(fout);
printf("Binary dosya yazildi! 💾\n");
}

// --- 2. BINARY OKUMA ---
Urun okunanUrun;
FILE *fin = fopen("urunler.bin", "rb"); // rb = read binary
if (fin != NULL) {
fread(&okunanUrun, sizeof(Urun), 1, fin);
fclose(fin);

printf("\n--- DOSYADAN OKUNAN BINARY NESNE ---\n");
printf("ID: %d | Urun: %s | Fiyat: %.2f TL\n", okunanUrun.id, okunanUrun.urunAdi, okunanUrun.fiyat);
}

return 0;
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde `FILE*` pointer kullanımını, dosya modlarını (`r`, `w`, `a`), `fprintf`/`fscanf` metin işlemlerini ve `fwrite`/`fread` ikili (binary) dosya yönetimini öğrendik.

👉 **Bölüm 11'de Bizi Ne Bekliyor?**
• Ön İşlemci Direktifleri (Preprocessor Directives) ve Makrolar 🛠️
• `#define` İle Makro ve Sabit Tanımlama
• Parametreli Makrolar (Macro Functions)
• Koşullu Derleme (`#ifdef`, `#ifndef`, `#endif`)
• Çokl
u Dosyalı Proje Mimarisi (`.h` ve `.c` Ayrımı, Header Guards)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 💻✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
136,880Threads
3,309,132Messages
328,727Members
DedeleregeldikLatest member
Top Bottom