C programlamada projeler geliştikçe, sabit diziler (static arrays) ve basit değişkenler yetersiz kalmaya başlar.
Eskiden veriyi kullanıcıdan almak yerine, kodun başında dizilerin boyutunu kendim belirliyordum (Örn: ogrenci[100]). Ancak bu durum esnekliği öldürüyordu. Örneğin; kullanıcı 5 kişilik bir sınıf girmek istediğinde ama ben kodu 8 kişilik ayarladığımda, bellekte 3 kişilik yer boşuna harcanıyordu (Memory Waste).
Bu israfın önüne geçmek ve kontrolü tamamen kullanıcıya vermek için projemde Dynamic Memory Allocation (malloc) kullanmaya karar verdim.
🛠️ Projede Kullandığım 3 Temel Yapı
Koda geçmeden önce, bu sistemin arkasındaki mühendislik kararlarını açıklamak isterim:
1. Struct (Yapı) ile Veri Paketleme
Öğrencinin adı (string), vize notu (int) ve final notu (int) birbirinden kopuk değişkenlerde durmamalıydı. Bunları typedef struct kullanarak tek bir paket haline getirdim. Böylece her öğrenci bir nesne gibi yönetilebiliyor.
2. Malloc ile Dinamik Bellek
Kullanıcı programı çalıştırdığında "Kaç kişi gireceksiniz?" diye soruyorum. Gelen sayı (kisi) ne kadarsa, malloc fonksiyonu ile RAM'de tam o kadar yer açıyorum.
- Sonuç: 100 kişilik yer açıp 3 kişi kaydetmek yok. Ne lazımsa o kadar hafıza tüketimi var.
3. Dosya İşlemleri (Append Modu)
Verilerin kalıcı olması için .txt dosyasına yazdırıyorum. Burada fopen fonksiyonunu "a" (append) moduyla açtım.
-
Neden "w" değil? Çünkü
"w"(write) modu dosyayı her seferinde sıfırlar. - Neden "a"? Append modu, dosya varsa açar ve imleci dosyanın en sonuna koyar. Böylece eski kayıtları silmeden, yeni öğrencileri listenin altına ekleyerek devam edebiliriz.
💻 Kodun Tamamı
İşte struct yapısını, dinamik bellek yönetimini ve dosya işlemlerini birleştirdiğim kod:
c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[20];
int vize;
int final;
} ogrenci;
int main(void) {
FILE *belge;
int i;
int kisi;
// Dosyayı "append" (ekleme) modunda açıyoruz
belge = fopen("notlar.txt", "a");
if ( belge == NULL ) {
printf("Error opening file");
exit(1); // Dosya açılmazsa programı güvenli şekilde kapat
}
printf("kisi sayisini giriniz: ");
scanf("%d", &kisi);
// Dinamik Bellek Tahsisi (Malloc)
ogrenci *dizi = (ogrenci*) malloc(kisi * sizeof(ogrenci));
for (i = 0; i < kisi; i++) {
printf("%d. ogrenci adini giriniz: ", i+1);
scanf("%s", dizi[i].name);
printf("ogrenci vize giriniz: ");
scanf("%d", &dizi[i].vize);
printf("ogrenci final giriniz: ");
scanf("%d", &dizi[i].final);
}
// Dosyaya Yazdırma
for (i = 0; i < kisi; i++) {
fprintf(belge, "%-10s // %-10d // %-10d \n", dizi[i].name, dizi[i].vize, dizi[i].final);
}
fclose(belge); // Dosyayı kapat
free(dizi); // Belleği temizle (Memory Leak önlemi)
printf("belge basarıyla olusturuldu ve veriler eklendi.\n");
return 0;
}
Top comments (0)