Şimdi Ara

C de dosya okuma konusunda yardım

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
16
Cevap
0
Favori
2.110
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar var olan aşağıdaki gibi deneme.txt dosyasından ilk başlardaki TCKN kısmındaki TC numaralarını çekmem gerekiyor ama bu değerlerin yandaki ve üst kısımdaki bölümler işi bozuyor. Sadece TCKN altını nasıl çekebilirim acaba?

     C de dosya okuma konusunda yardım


    Yeni Problem

    Arkadaşlar dosyadan atıyorum girilmiş olan 3 tane Ad okutuyorum, okuttan sonra bunları bi dizide toplamak istiyorum. Tutmak istediğim şekil ise şöyle diznin 0. indisinde 1. isim, 1. indisinde 2. isim, 2. indisinde 3. isim şeklinde ne şekilde yapabilirim acaba?

     C de dosya okuma konusunda yardım



    < Bu mesaj bu kişi tarafından değiştirildi metinolampx -- 24 Ekim 2011; 22:11:35 >







  • fscanf ile bir kere okuduğun zaman sadece tc numarasını alır. Satırın geri kalanını atmak için bir kere fgets çağırırsın.

    char satir[100], tckn[12];
    FILE* dosya = fopen("xxx.txt", "r");

    fgets(str, 100, dosya); // Başlık satırını geç.
    fscanf(dosya, "%s", tckn); // İlk numarayı al.
    fgets(str, 100, dosya); // Satırın geri kalanını geç.
    fscanf(dosya, "%s", tckn); // 2. numarayı al.
    ...
  • çok teşekkür ederim.

    peki aynı şekilde ad bölümündekinin altındaki bilgileri çekmek mümkünmüdür?



    < Bu mesaj bu kişi tarafından değiştirildi metinolampx -- 8 Ekim 2011; 20:37:16 >
  • Sadece ad kısmını almak istiyorsanız, ek olarak ad isminde bir dizi oluşturup, tc kimlik numarasını çektikten sonra, tekrar scanf fonksiyonunu kullanarak ad kısmını okuyabilirsiniz. Şöyle ki;

    char satir[100], tckn[12], ad[15];
    FILE* dosya = fopen("xxx.txt", "r");

    fgets(str, 100, dosya);
    fscanf(dosya, "%s", tckn);
    fscanf(dosya, "%s", ad);
    fgets(str, 100, dosya);
    fscanf(dosya, "%s", tckn);
    fscanf(dosya, "%s", ad);
    ....


    veya fseek fonksiyonu ile imleci hareket ettirebilirsiniz. Bunu kullanarak tam istediğiniz noktaya yollayabilirsiniz imleci, daha sonra da okutma işlemini gerçekleştirirsiniz.

    fseek(dosya, hareket miktarı, SEEK_CUR);

    hareket miktarı: imlecin hareket edeceği miktar. poizitif değer girilirse ileri, negatif girilirse geri hareket eder.

    SEEK_SET: Dosyanın başından başlar.
    SEEK_CUR: İmlecin bulunduğu yerden başlar.
    SEEK_END: Dosyanın sonundan başlar.




  • Bu şekilde her sütuna nokta atışı yapmak doğru bir yöntem sayılmaz. Bir kere elle müdahale olmayacaksa (ki olmamalı) o başlık satırı silinmeli. txt uzantısını da değiştirsen fena olmaz.

    Kişi bilgileri gayet düzenli bir yapıda. Bunlar programın açılışında komple okunup bir struct içinde depolanırsa istediğin an hızlıca elde edilebilir çünkü bir daha dosya ile işin kalmıyor. Tek sorun her yeni kişi bilgisini ekleyebilecek, arayabilecek, gerekirse silebilecek bir yapı kurmak. Bunlar tamamsa gerisi kolay.
  • teşekkürler arkadaşlar,

    elektro_gadget, bizden istenen okulda görmek istedikleri format bu şekilde olduğu için mecbur o yönde yapmaya çalışıyorum. Tavsiye ve çözümler için tekrardan teşekkür ederim.
  • arkadaşlar ilk mesaja yaşadığım problemi yazdım, yardımcı olabilirseniz sevinirim.
  • sanırım string ifadeli dizi oluşturulamıyor, bir araya geldiği zaman string ifade oluşturan karakter dizileri var, ki bunun dizinin içersine string değerleri atayarak, istediğiniz zaman onlara ulaşmanız zor. Ama oluşturmuş olduğunuz struct ifadeyi dizilerle kullanırsanız, çok daha kullanışlı olur. Şöyle ki

    typedef struct{
    char ad[50], soyad[50], sehir[50] email[50];
    int tckn[11], tel[15], dt[10], mh;
    } bilgi;

    ..... // main fonksiyonu

    bilgi kisi[10];


    kisi[0].tckn=scanf(dosya, "%s", tckn);
    kisi[0].ad=fscanf(dosya, "%s", ad);
    kisi[1].tckn=fscanf(dosya, "%s", tckn);
    kisi[1].ad=fscanf(dosya, "%s", ad);

    gibi. Bu şekilde istediğiniz gibi ve zahmetsiz işlem yaptırabilirsiniz dosyadaki verilere. Yanlışım varsa çok özür dilerim.
  • teşekkür ederim, şu aşamada hata alıyorum

    kisi[0].tckn=fscanf(dosya, "%s", tckn);

    hata mesajı: request for member `tckn' in something not a structure or union



     C de dosya okuma konusunda yardım
  • 2d char dizisi ile olur. Akşam örnek kod yazarım olmazsa.
  • 2d char dizisi, 2d int dizisi gibi çalışmadığından bi türlü yapamadım ben, örnek kod veya kaynak varsa çok işime yarayacak teşekkürler şimdiden.
  • quote:

    Orijinalden alıntı: metinolampx

    2d char dizisi, 2d int dizisi gibi çalışmadığından bi türlü yapamadım ben, örnek kod veya kaynak varsa çok işime yarayacak teşekkürler şimdiden.

    Ben hata yaptım sanırım, kusura bakmayın.

    kisi[0].tckn=fscanf(dosya, "%s", tckn); yerine direk olarak; fscanf(dosya, "%s", kisi[0].tckn); yazarak dener misiniz ?
  • ne kusuru kardeş, çok teşekkür ederim çözüm önerilerin için, bu şekilde de aynı hatayı verdi.
  • struct yapısından typdef'i silip, tanitma şeklinide böyle yapınca sonuç aşağıdaki gibi oldu;

     C de dosya okuma konusunda yardım  C de dosya okuma konusunda yardım  C de dosya okuma konusunda yardım

    aldıktan hemen sonra tckn adında yazdırırken normal istediğim gibi iken, neden aşağıdaki döngüde yazdırdığım tckn_yazdir adında olanları birbirine karıştırdı acaba?



    < Bu mesaj bu kişi tarafından değiştirildi metinolampx -- 25 Ekim 2011; 20:31:40 >




  • stringler için yer ayırırken bir karakter fazla olması lazım. Çünkü sonuna null karakter eklenir. Yani tckn[12] yaparsan büyük ihtimal hallolur.

    fscanf teki & işareti orada olmamalı. Normalde bu kodun hiç derlenmemesi lazım ama scanf için bir istisna olabilir. Yanlış yani onu bil.

    2d char dizisi ile şöyle olur.
    char tckn[3][12];

    for(int n = 0;n < 3;n++)
    fscanf(oku, "%s", tckn[n]);
  • çok teşekkür ederim şuan problemsiz çalışıyor, 2d char dizisinde tam olarak o şekilde bir denemem olmuştu ama demek problem 12 den kaynaklanıyormuş, programın diğer yerlerinde okumalarda dahil hep 11 olarak kullanmıştım oysa önceden ama hiç problem vermemişti.

    diğer kısımlarıda dediğiniz şekilde olması gerektiği gibi değiştirdim tekrardan çok teşekkür ederim.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.