C De Böyle Bir Şey Mümkün Mü ?
-
abc türünde yapi tipinde dizi tanimladim. doğrudan erişimli dosyadan okuduğum her veriyi yapıda dizide ayrı bölgelerde sıralı tutmak istiyorum. ama request for member... hatasi veriyor. deitelde bununla ilgili bir örnek yok. yaptığım mantıklı değil mi hata neden kaynaklanıyor ?
#include <stdio.h> #include <stdlib.h> struct ogrenci_Bilgisi { int ogr_no; char adsoyad[30]; int sinif; int al_kredi; float ortalama; }; typedef struct ogrenci_Bilgisi Bilgi; int main() { FILE *aptr; Bilgi abc[10]; if((aptr=fopen("ogrenciler.dat","r"))==NULL) printf("Dosya Acilamadi\n"); else { while (!feof(aptr)) { fread(abc,sizeof(Bilgi),1,aptr); } printf("%s %d %d %d %d",abc.adsoyad,abc.al_kredi,abc.ogr_no,abc.ogr_no,abc.ortalama,abc.sinif); } return 0; } -
Hocam emin değilim ama fread pointer'ı kaydırıyor mu? yoksa sürekli abc array'inin ilk elemanına yazıyomuşssun gibi geliyor bana. Bi de ekrana basarken abc[0].ad,abc[0].soyad gibi bastırmayı deneyebilir misin?
Ayrıca nickini görünce aklıma geldi, hala gönderemedim senin kargoyu hocam hafta içi fırsatım olursa göndereyim. Aynı adrestesin di mi?
-
NmC bunu yazdı
Hocam emin değilim ama fread pointer'ı kaydırıyor mu? yoksa sürekli abc array'inin ilk elemanına yazıyomuşssun gibi geliyor bana. Bi de ekrana basarken abc[0].ad,abc[0].soyad gibi bastırmayı deneyebilir misin?
Ayrıca nickini görünce aklıma geldi, hala gönderemedim senin kargoyu hocam hafta içi fırsatım olursa göndereyim. Aynı adrestesin di mi?
Printf içini dediğin gibi yaptım mesela [0] yaptım doğru okudu ama 1 yapınca okumadı &abc kısmını değiştirmem gerek ama nasıl ??
edit// 0 yazıncada dosyanın en sonundaki elemanı yazdı ilkini değil yani.
edit2//
fread(&abc[0],sizeof(Bilgi),1,aptr);
fread(&abc[1],sizeof(Bilgi),1,aptr);yapınca doğru şekilde doğru okudu demmekki böyleymiş bir şey idaha deneme yanılma ile buldum :)
zeybekustasi tarafından 22/Mar/13 03:36 tarihinde düzenlenmiştir -
zeybekustasi bunu yazdıNmC bunu yazdı
Hocam emin değilim ama fread pointer'ı kaydırıyor mu? yoksa sürekli abc array'inin ilk elemanına yazıyomuşssun gibi geliyor bana. Bi de ekrana basarken abc[0].ad,abc[0].soyad gibi bastırmayı deneyebilir misin?
Ayrıca nickini görünce aklıma geldi, hala gönderemedim senin kargoyu hocam hafta içi fırsatım olursa göndereyim. Aynı adrestesin di mi?
Printf içini dediğin gibi yaptım mesela [0] yaptım doğru okudu ama 1 yapınca okumadı &abc kısmını değiştirmem gerek ama nasıl ??
edit// 0 yazıncada dosyanın en sonundaki elemanı yazdı ilkini değil yani.
edit2//
fread(&abc[0],sizeof(Bilgi),1,aptr);
fread(&abc[1],sizeof(Bilgi),1,aptr);yapınca doğru şekilde doğru okudu demmekki böyleymiş bir şey idaha deneme yanılma ile buldum :)
Hocam işte normalde 10 elemanlık yer almışsın ama her seferinde 1. elemana yazıyodun :) Çözümü kendin halletmişsin pointer aritmetiği ile farklı şekilde de çözülebilir while dışına
Bilgi * x = abc;
while(!
feof(aptr)){fread(abc,sizeof(Bilgi),1,aptr);x = x +sizeof(Bilgi);
}
daha sonra gene abc[0],abc[1] şeklinde okuyabilirsin.
-
Dosya sonunu feof ile denetlemeyin, fread'in dönen değerini kontrol edin. Bir de zaten 10'a 10'a okuyacağız, niçin fread'e doğrudan "Bilgi yapısının on katı kadar oku" demiyoruz? Sonuçta Bilgi adlı yapılar bellekte sıralı olarak duruyor.
