Created
November 21, 2010 17:29
-
-
Save sayz/708934 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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