Araştırılması gereken şeyler, ama 3 ayda bir dil değiştirilince dili tamamıyla ğrenmek imkansız oluyo :/ zamanla olucak benden de bişeyler inşallah... şimdi anlattıklarını iyice bi anlayıp sindireyim :) :)

#include<stdio. h> #include<locale> FILE dsy; char TCNo ; char ad ; char soyad ; char odaNo ; char tarih ; int giris=0; int main { //Türkçe karakterler setlocale ; //Menü while((giris!=5)) { printf(" MENÜ\n \n Kayıt ekle\n Kayıt düzenle\n Kayıt sil\n Kayıt bul\n Çıkış\n"); scanf ; if(giris 5) else if(giris 1) else if(giris 2) else if(giris 3) else if(giris 4) else printf ; } } hocam kodlarda oynama yaptım biraz. umarım fputs ve fgets stdin ile yapman gerekmiyordur bunu. fopenları her case in başına koydum çünkü sadece program ilk açıldığında dosyanı çağırırsın. case bittikten sonra kapanır dngünün dışında açıldığı için bir daha işlem yapılamaz. sanırsam kayıt bulmayı olayında da string. h kütüphanesine ihtiyacın olacak. onu çağırman lazım punto cero

Çok sağol demek istediklerini anladım. EDİT: string. h ekleyince sorun düzeldi. verdiğin kodlarda arama işi tamam ama kayıtta haala sorun var tcden sonra ad ve soyadı birlikte soruyo, değerlerden biri null oluyo bu seferde bi sonraki kayıdın bilgileriyle karışıyo nceki kayıt. Çzmeye çalışıcam... :)

: Benim verdiğim kodu hem mingw hem visual C++ ile derledim, kayıtta herhangi bir sıkıntı yok, scanf den kaynaklanan sorunu ve çzümünü ilk mesajda gstermiştim zaten, scanf \n karakterini girişte bıraktığı için TC no isteyen fgets, \n karakterini girişten alıp direkt sonlanıyor ve sonraki fgets çağırılıyordu, girişi boşaltman için getchar kullanmanı nermiştim, benim verdiğim kodu birebir kopyalayıp dener misin? string. h kütüphanesini eklemeden derlenmiyo, onuda ekleyerek derledim sonuç bu. visual studio 2010 ultimate kullanıyorum. devc++ ta da denedim ama strcmp fonksiyonu yüzünden o da hata veriyo. :)

#include<stdio. h> #include<locale> FILE dsy; char TCNo ; char ad ; char soyad ; char odaNo ; char tarih ; int giris=0; int main { //Türkçe karakterler setlocale ; //Dosya oluşturma & açma dsy = fopen ; //Menü while((giris!=5)) { printf(" MENÜ\n \n Kayıt ekle\n Kayıt düzenle\n Kayıt sil\n Kayıt bul\n Çıkış\n"); scanf ; if(giris 5) else if(giris 1) else if(giris 2) else if(giris 3) else if(giris 4) else printf ; } } Yazdığım kod henüz bu kadar. nümde 2 hafta falan var daha teslim etmek için. Zaman bol olunca sallaya sallaya yapıyorum tabi işin aslı :D eksiklerimde var ayrıca, işin içinden tam çıkamıyorum... Şimdi bu kodlar hastalistesi. dat dosyasını oluşturup kayıt yapıyo ama her değişken bir alt satıra kayıt oluyo. Ve bir problemde şu ki ben arama yaptırdığım zaman bulunan tc kimlik no değerine ait tüm bilgiler gelmeli ama nasıl olacak? Birde kodları çalıştırırsanız grürsünüz, tc no sormadan direk ad soruyo. Bunları nasıl halledebilirim, bi yol gsterin :/ :)

Sen tc kimlik nosunu alırken 11 karakter girmişsin, sorun şu, fgets fonksiyonu, ikinci parametresindeki değer yeterli ise, \n dahil girişteki tüm veriyi okuyup stringe aktarır. Ancak sen girişi 11 karakter ile sınırlamışsın fgets de, bende kaynak koda ekleme yaptım, bu fgets sorununu yukarıdaki nerilerde belirttim ve kendi eklediğim blümde fgets i doğru kullandım, ancak senin yazdığın blümü editlemeyi unutmuşum. zetle yapman gereken, fgets in ikinci parametresini sizeof olarak değiştirmek. Aksi halde fgets girişten 11 karakter okuyor(aslında 12 var \n ile beraber) ve dnüyor. Bir sonraki fgets yine o karakteri yani \n i okuyarak dnüyor. Ne yazıkki C de string fonksiyonları ya çok güvensizdir, yani string boyutunu aştığınızda güvensiz bellek alanına veri yazar, ya da fgets de olduğu gibi 2. parametrede verilen üst limitten sonrasını okumaz girişte bırakır. İkisi de çok ktü bir yntem. C de girilen veriye gre genişleyen bir string fonksiyonu henüz yok.

Çok sağol, dediğin gibi sizeof yapınca tüm sorunlar halloldu :) anlattığın şeyler için çok sağol, derslerde yada her forumda grebileceğimiz türden şeyler değiller. Ayrıca soket programlama dkümanın da çok iyi, ordada yazdığın gibi soket programlamayla ilgili fazla bi bilgi yok olanlarda da pek bişey yok. :)

Benim verdiğim kodu hem mingw hem visual C++ ile derledim, kayıtta herhangi bir sıkıntı yok, scanf den kaynaklanan sorunu ve çzümünü ilk mesajda gstermiştim zaten, scanf \n karakterini girişte bıraktığı için TC no isteyen fgets, \n karakterini girişten alıp direkt sonlanıyor ve sonraki fgets çağırılıyordu, girişi boşaltman için getchar kullanmanı nermiştim, benim verdiğim kodu birebir kopyalayıp dener misin?

: Çok sağol :) yani buradan anlayacağımız şey "Yaşasın c#" :D anlattığın şeyler için çok sağol, derslerde yada her forumda grebileceğimiz türden şeyler değiller. Ayrıca soket programlama dkümanın da çok iyi, ordada yazdığın gibi soket programlamayla ilgili fazla bi bilgi yok olanlarda da pek bişey yok. O dküman yüzünden çok kişi ekliyor ama üzerindeki tarihten daha eski bir dküman ve içinde ufak defek hatalar var. Ayrıca artık blocking socket fonksiyonları profesyonel yazılımlarda kullanılmıyor, tabi başlangıç için ideal. bende I/O completion port gibi yntemler üzerinde çalışıyorum şu sıralar :)

ncelikle son sorunun sebebi şu, scanf veri okurken enter tuşunu okumaz, doğal olarak bu stdin de kalır, sonraki fonksiyon, scanf, fgets vb veri okumaya kalktığında bu \n karakterini grür ve onu okuyarak sonlanır. Bu karakteri stdin den silmek için çeşitli yollar var, mesela fflush fonksiyonu kullanılır genelde ancak input stream için bu fonksiyon tanımsız davranışlıdır , yani tüm derleyiciler bu fonksiyon ile stdin buffer ini boşaltmana izin verir ancak standartlarca garanti edilmez. Bu yüzden diğer yntemlerden birisini kullan, scanf den sonra, getchar ile o karakteri oku ve buffer i boşalt. ... scanf ; getchar ; ... Altalta yazma meselesine gelince, bu fgets ile ilgili, scanf in aksine fgets girişten veriyi okuduktan sonra enter tuşunu da okur, doğal olarak stringin sonunda bu karakterde olur. sen bunu dosyaya yazdığın zaman doğal olarak sonraki veri bir alt satırdan başlar. Aslında bu iyi bişey, çünkü verileri yan yana tutarsan, ayraç olarak boşluk kullanmak zorundasın ve dosyadan okuma için fscanf kullanmalısın. fscanf boşluğa gre verileri ayıracak ama mesela iki isimli kişilerde bu sorun olur. Aramayı senin kodu etkilemeden şu şekilde yazabilirim, fseek ile dosya başına konumlan, counter 5 in katı ise, o okunan veri tc no dur. her veri okumada counter i bir arttır, tc no yu okuduğunda aranan ile strcmp kullanarak karşılaştır, aynı ise bulundu yaz ve sonraki 4 veriyi de ekrana yaz. counter e -1 koy ve dngüden çık. dngüden 2 şekilde çıkılabilir, ya dosya sonlanır, ya da kayıt bulunmuştur, kayıt bulunduysa counter -1 dir, aksi halde pozitif bir sayı. dngü sonunda counter in değerine gre dngüden ne şekilde çıkıldığı anlaşılabilir ve eğer kayıt bulunamamışsa (counter!= -1) bulunamadı yazılır. kodu yazmadan nce bir kaç tavsiye. - Eğer yapıları grdüyseniz kullanıcı bilgilerinin hepsini tek bir yapı içinde tut. - fonksiyonları grdüyseniz kullanıcı seçeneğini girdiğinde yapılacak olan işi ayrı bir fonksiyon olarak yaz ve yapı adresini parametre olarak yolla. - dosyayı binary olarak aç, yapının toplam boyutuna gre kaydı dosyadan fread ile oku ve okunan veri doğrudan yapıya aktarılsın. - her seçenekten sonra dosyayı açıp kapama yapma, birkez aç ve kayıttan sonra fflush ile bufferi boşaltarak tüm verinin diske yazılmasını sağla. - karakter dizilerini 10-20 baytlık yapma en az 128 olsun, mesela tc no 11 hane, eğer 9 hane girersek \n i de alıyor ve dosyaya yazıyor, ancak 11 hane girersek sadece tam olarak tc no yu alıyor ve sonraki girdi dosyada tc no ile bitişik oluyor. fgets de pek kaliteli bir fonksiyon sayılmaz. kod : #include <stdio. h> FILE dsy; char TCNo ; char ad ; char soyad ; char odaNo ; char tarih ; int giris=0; int main { //Dosya oluşturma & açma dsy = fopen ; //Menü while((giris!=5)) { printf(" MENU\n \n Kayit ekle\n Kayit duzenle\n" " Kayit sil\n Kayit bul\n Cikis\n"); scanf ; getchar ; // dikkat if(giris 5) else if(giris 1) else if(giris 2) else if(giris 3) else if(giris 4) { char tmp , tc ; int counter = 0; fseek(dsy,0, SEEK_SET); // dosya basina konumlan printf ; fgets(tc, sizeof , stdin); while(! feof // dosya sonuna gelindi mi? { fgets(tmp, sizeof , dsy); // dosyadan satir oku if( counter++ %5 0) { if(! strcmp // tc kimlik no bu mu } } if(counter!= -1) // donguden ne sekile cikildi fseek(dsy,0, SEEK_END); } else printf ; } }