Skip to content

Instantly share code, notes, and snippets.

@sayz
Created November 21, 2010 17:29
Show Gist options
  • Save sayz/708934 to your computer and use it in GitHub Desktop.
Save sayz/708934 to your computer and use it in GitHub Desktop.
/*
kayit_kutuk.c programı şu konuları örnekler :
Bir giriş kütüğünden yapı (struct) bilgilerinin okunması,
Okunan yapı bilgileriyle devingen bellek ataması yöntemiyle yapı listesinin oluşturulması,
Yapı listesi içeriğinin çıkış kütüğüne yazılması.
Erkan Yasan
20.11.2005
*/
#include <stdio.h> /* printf, scanf ve gets işlevleri için başlık kütüğü (header file) */
#include <string.h> /* strcpy işlevi için başlık kütüğü */
#include <stdlib.h> /* malloc işlevi için başlık kütüğü */
#include "liste.h" /* printf, scanf ve gets işlevleri için başlık kütüğü (header file) */
#define GIRIS_KUTUGU "ogrenci.inp"
#define CIKIS_KUTUGU "ogrenci.out"
#define GIRIS_KUTUGU_ACMA_HATASI 1
#define CIKIS_KUTUGU_ACMA_HATASI 2
#define SATIR_UZUNLUGU 100
/**********************/
/* İşlev prototipleri */
/* kayitOku işlevi, giris kütüğünü okur ve öğrenci kayıtlarını oluştururur */
UINT kayitOku(FILE *giris, ogrenciTur **oo);
/* listeYaz yordamı, "o" ile gösterilen listedeki öğrenci bilgilerini, "cikis" kütüğüne yazar */
void listeYaz(FILE *cikis, ogrenciTur *o);
/* listeSil yordamı, "o" ile gösterilen listedeki düğümleri serbest bırakır (frees the nodes of list o) */
void listeSil(FILE *cikis, ogrenciTur *o);
/* boslukSil yordamı, "c" ile gösterilen dizginin başındaki ve sonundaki boşluk karakterlerini siler */
void boslukSil(char *c);
/* İşlev prototipleri */
/**********************/
int main (void) {
FILE *giris, /* Giriş kütüğüne gösterge */
*cikis; /* Çıkış kütüğüne gösterge */
ogrenciTur *ogrenciListesi;
int donenDeger = 0; /* Main işlevinin döndüreceği değer */
/* Kütükleri aç */
if ((giris = fopen(GIRIS_KUTUGU, "r"))) { /* Giriş kütüğü sorunsuz açıldıysa */
if ( ! (cikis = fopen(CIKIS_KUTUGU, "w"))) { /* Çıkış kütüğü açılamadıysa */
/* Açılmış olan giriş kütüğünü kapat */
fclose(giris);
printf("Cikis kutugu acilamadi !\n");
donenDeger = CIKIS_KUTUGU_ACMA_HATASI;
} else {
/* Giriş kütüğündeki öğrenci bilgilerini okuyarak öğrenci listesini oluştur */
printf("Ogrenci kayitlari okunuyor ve liste olusturuluyor\n");
if (!kayitOku(giris, &ogrenciListesi)) {
/* Öğrenci bilgileri sorunsuz şekilde okunduysa !*/
/* Oluşturulan öğrenci listesini çıkış kütüğüne dök */
printf("Ogrenci listesi cikis kutugune yaziliyor\n");
fprintf(cikis, "\t\tÖğrenci Listesi:\n\t\t----------------\n");
listeYaz(cikis, ogrenciListesi);
/***********************************************/
/* Oluşturulan öğrenci listesini serbest bırak */
printf("Ogrenci listesi siliniyor\n");
fprintf(cikis, "\n\n\t\tÖğrenci Listesi Silme İşlemi:\n\t\t-----------------------------\n");
listeSil(cikis, ogrenciListesi);
/***********************************************/
}
else
printf("Ogrenci listesi olusturulurken hata olustu\n");
/* Giriş ve çıkış kütüğünü kapat */
fclose(giris);
fclose(cikis);
}
}
else {
printf("Giris kutugu acilamadi !\n");
donenDeger = GIRIS_KUTUGU_ACMA_HATASI;
}
return donenDeger;
}
/*
kayitOku işlevi, giris kütüğünü okur ve öğrenci kayıtlarını oluştururur.
Kütük başarılı bir şekilde işlenirse 0 döndürür, *oo, liste göstergesiyle günlenir;
okuma sırasında sorun oluşursa bir hata kodu döndürür, *oo'ya NULL aktarılır.
*/
UINT kayitOku(FILE *giris, ogrenciTur **oo) {
char satir[SATIR_UZUNLUGU], *c;
ogrenciTur *listeBasi, *listeSonu = NULL, *yeni;
UINT donenDeger = 0; /* Döndürülecek başarı ya da hata kodu */
c = (char *) malloc(DIZGI_BOYU * sizeof(char)); /* dizgi için yer al (örnek kullanım) */
while (fgets(satir, SATIR_UZUNLUGU, giris) && !donenDeger ) {
/* Yeni bir kayıt okunuyor */
yeni = (ogrenciTur *) malloc (sizeof(ogrenciTur)); /* Yeni öğrenci bilgileri için bellekten yer al */
yeni->sonraki = NULL;
if (!listeSonu) /* Henüz ilk kayıt ekleniyor */
listeBasi = yeni; /* Liste göstergesini belirle */
c = strtok(satir, "=:"); /* ogrenciNo dizgisini al */
c = strtok(NULL, "=:"); /* Öğrenci numarasını al */
yeni->ogrenciNo = atoi(c);
if ( fgets(satir, SATIR_UZUNLUGU, giris) ) { /* Öğrencinin adını oku */
c = strtok(satir, "=:"); /* ogrenciAdi dizgisini al */
c = strtok(NULL, "\n"); /* Öğrenci adını al */
if (c) {
boslukSil(c);
strcpy(yeni->ogrenciAdi, c);
if (listeSonu)
listeSonu->sonraki = yeni;
listeSonu = yeni; /* Yeni eklenen eleman, son elemandır */
}
else
donenDeger = 2; /* Öğrenci adı okunamıyor */
}
else
donenDeger = 1; /* Öğrenci adı satırı mevcut değil */
}
free(c);
if (! donenDeger)
/* Kütük başarılı şekilde okunmuş ve liste kurulmuştur */
*oo = listeBasi;
else
/* Kütük okuma sırasında hata oluşmuştur */
*oo = NULL;
return donenDeger;
}
/*
listeYaz yordamı, "o" ile gösterilen listedeki öğrenci bilgilerini, "cikis" kütüğüne yazar
*/
void listeYaz(FILE *cikis, ogrenciTur *o) {
ogrenciTur *gecici;
int sayac = 0;
gecici = o;
while (gecici) {
fprintf(cikis, "%2d. Öğrenci : %d, %s\n", ++sayac, gecici->ogrenciNo, gecici->ogrenciAdi);
gecici = gecici->sonraki;
}
}
/*
listeSil yordamı, "o" ile gösterilen listedeki düğümleri serbest bırakır (frees the nodes of list o)
*/
void listeSil(FILE *cikis, ogrenciTur *o) {
if (o) {
if (o->sonraki)
listeSil(cikis, o->sonraki);
fprintf(cikis, "%-22s isimli ögrencinin kaydı siliniyor ! \n", o->ogrenciAdi);
free(o);
}
else
fprintf(cikis, "Silinecek öğrenci kaydı yok...\n");
}
/*
boslukSil yordamı, "c" ile gösterilen dizginin başındaki ve sonundaki boşluk karakterlerini siler
*/
void boslukSil(char *c) {
int k;
if (c) { /* NULL string değilse ! */
/* Baştaki boşlukları yok et */
while ((c[0] == ' ') || (c[0] == '\t'))
for (k = 0; c[k] != '\0'; k++)
c[k] = c[k + 1];
/* Sondaki boşlukları yok et */
k = strlen(c) - 1; /*Dizginin son karakterine bak*/
while ((c[k] == ' ') || (c[k] == '\t') || (c[k] == '\n')) {
c[k] = '\0';
k--;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment