linked list kullanılarak yazılan telefon defteri/öğrenci kayıtları için örnek kodlar arıyorum. bu kayıtlar text dosyasına kaydedilecek, her program çalıştırıldığında dosyandan okuyup listeye yerleştirecek. c++ da yazılan bir şeyler var ama c için bulamadım. yardım ederseniz çok sevinirim.
İnan ki böyle programları okuyup anlamaya çalışmak, sıfırdan yazmaktan daha zordur. Bağlı liste son derece basit bir veri yapısı. Düğümü dosyaya yazıp okuma işini çözersen gerisi kolay.
struct _TelDef { //Telefon bilgilerini tutan yapı char adi[30]; char soyadi[30]; char tel_num[12]; struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi } *_baslangic; //Listenin başlangıç adresini tutar typedef struct _TelDef TelDef;
void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur { fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar fgets(dugum->soyadi, 30, dosya); fgets(dugum->tel_num, 12, dosya); dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0'; dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0'; }
void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri { //saklar ve düğümleri birbirine bağlar TelDef *dugum; FILE *dosya = fopen("telefon defteri.tlf", "r"); if(!dosya) return;
if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için yer ayrılır ve başlangıç adresi olarak kaydedilir.*/
kisiOku(dugum, dosya); } else { fclose(dosya); // Dosya boş ise kapat ve çık. return; }
while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve dugumlere kaydedilir*/
bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve { //hem belleğe hem de dosyaya yazar. TelDef *dugum = _baslangic; FILE *dosya = fopen("telefon defteri.tlf", "a"); if(!dosya) return false;
bu kısmı geçtim. şimdi isimleri yerleştireceğim. ama alfabetik sıralı olacak. onu nasıl yapacağım? sayı olsa büyük/küçük diye bakılırda burada nasıl olacak? özel fonksiyon mu var?
Bildiğim kadarıyla c'de bağlı listeleri sıralayan hazır bir fonksiyon yok. Olsa bile, kişi bilgilerinden bir parametre seçip (mesela adı) onu küçük mü veya büyük mü diye karşılaştırabilesin ki sıralanabilsin. Neyse ki iki stringi karşılaştırabilen strcmp var. Bu fonksiyonun aldığı ilk parametre ikincisinden önce geliyorsa (alfabetik olarak) -1, sonra geliyorsa 1, aynı ise 0 döndürür. Böylece isimden yola çıkarak hangi düğümü nereye bağlayacağını bulabilirsin. Tabi sıralama algoritması sana kalmış.
dosyadan isim soyadı filan okumaya çalışıyorum ama beceremedim. internette sscanf ve strtok fonksiyonlarınu gördüm. ama bunları nasıl kullanıcağımı bilmiyorum. dosyam isim/soyisim.... şeklinde her satırda bir kişi var.
struct _TelDef { //Telefon bilgilerini tutan yapı char adi[30]; char soyadi[30]; char tel_num[12]; struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi } *_baslangic; //Listenin başlangıç adresini tutar typedef struct _TelDef TelDef;
void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur { fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar fgets(dugum->soyadi, 30, dosya); fgets(dugum->tel_num, 12, dosya); dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0'; dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0'; }
void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri { //saklar ve düğümleri birbirine bağlar TelDef *dugum; FILE *dosya = fopen("telefon defteri.tlf", "r"); if(!dosya) return;
if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için yer ayrılır ve başlangıç adresi olarak kaydedilir.*/
kisiOku(dugum, dosya); } else { fclose(dosya); // Dosya boş ise kapat ve çık. return; }
while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve dugumlere kaydedilir*/
bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve { //hem belleğe hem de dosyaya yazar. TelDef *dugum = _baslangic; FILE *dosya = fopen("telefon defteri.tlf", "a"); if(!dosya) return false;
main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.
konu biraz eski ama araştırma sırasında buldum ve işime yarayan bir örnek olduğu için yorum yazma gereksinimi duydum. hocam programı denedim sorunsuz çalışıo fakat buna bi kayıt silme ve kayıt değiştirme olayını nasıl ekleriz?
struct _TelDef { //Telefon bilgilerini tutan yapı char adi[30]; char soyadi[30]; char tel_num[12]; struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi } *_baslangic; //Listenin başlangıç adresini tutar typedef struct _TelDef TelDef;
void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur { fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar fgets(dugum->soyadi, 30, dosya); fgets(dugum->tel_num, 12, dosya); dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0'; dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0'; }
void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri { //saklar ve düğümleri birbirine bağlar TelDef *dugum; FILE *dosya = fopen("telefon defteri.tlf", "r"); if(!dosya) return;
if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için yer ayrılır ve başlangıç adresi olarak kaydedilir.*/
kisiOku(dugum, dosya); } else { fclose(dosya); // Dosya boş ise kapat ve çık. return; }
while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve dugumlere kaydedilir*/
bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve { //hem belleğe hem de dosyaya yazar. TelDef *dugum = _baslangic; FILE *dosya = fopen("telefon defteri.tlf", "a"); if(!dosya) return false;
main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.
Konuyu hortlatmak zorundayım :) bir sorum olacak hocam . Ben kişileri satır satır okutmak istiyorum ve kişi bilgilerini virgülle ayırmak istiyorum . Nasıl yaparım ?
Konuyu hortlatmak gibi olacak hocam kusura bakmayın ama içimden teşekkür etmek geldi. Allah sizden razı olsun. Sizin sayenizde eksiğim olan bir çok eksiği görmüş oldum, öğrendim. Belki yıllar sonra bu yazıyı okuduğunuzda yüzünüzde bir tebessüm oluşturur diye bu dizeleri kaleme alıyorum. Allaha emanet olun.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.
Bu mesaja 4 cevap geldi. Cevapları Gizle
teşekkürler. yeterli gözüküyor. hemen incelemeye ve üstünde çalışmaya başlıyorum.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 1 cevap geldi. Cevapları Gizle
konu biraz eski ama araştırma sırasında buldum ve işime yarayan bir örnek olduğu için yorum yazma gereksinimi duydum. hocam programı denedim sorunsuz çalışıo fakat buna bi kayıt silme ve kayıt değiştirme olayını nasıl ekleriz?
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @LynXMaSTeR
console hocam
Konuyu hortlatmak zorundayım :) bir sorum olacak hocam . Ben kişileri satır satır okutmak istiyorum ve kişi bilgilerini virgülle ayırmak istiyorum . Nasıl yaparım ?
Bu mesajda bahsedilenler: @Guest-BF8E9B238