PDA

Tam Sürümünü Görmek İçin : Dosyanin sonuna kadar okuma


FoX_
31/03/2007, 00:30
Selam arkadaslar;

Benim sorunum su sekilde:

Belirttiginiz dizinde bir .txt dosyasi var ve ben bu dosyanin icindekileri okuyup ekrana yazdirmak istiyorum:


fPtr = fopen("deneme.txt","r");





fscanf(fPtr,"%s",ogrIsim);

fscanf(fPtr,"%s",ogrSoyAd);

fscanf(fPtr,"%d",&not1);




while(!feof(fPtr)){

printf("%s ",ogrIsim);
printf("%s ",ogrSoyAd);
printf("%d ",not1);
printf("\n");


fscanf(fPtr,"%s",ogrIsim);

fscanf(fPtr,"%s",ogrSoyAd);

fscanf(fPtr,"%d",&not1);

}




fclose(fPtr);
printf("Goruntuleme islemi bitti.\nYeni kayit icin (y), goruntuleme icin (g), cikis icin (c)\n");
}



Bu sekilde dosyadaki verileri dogru bir sekilde ekrana yaziyor.Sorunda burada iste.Neden bu sekilde ekrana yaziyor???
Bu kodun butun verileri nasil ekrana yazdirdigini anlayamadim.Cunku benim mantigima gore:

Eger alt alta siralanmis ad soyad 234324 gibi bir sey dusunursek:(3 satir oldugunu kabul edelim)

while ' a girmeden once ilk 3 veriyi okuyacak.While'a girdikten sonra okuduklarini yazdirip, ikinci satirdaki verileri okuyacak.Bunlari da ekrana yazdirdiktan sonra 3.(son) satirdaki verileri okuyacak.
Sorun tam bu noktada iste.Son satirdaki verileri okuduktan sonra pointer EOF'yi isaret etmiyor mu?Bu yuzden while'in basina geldiginde karsilastirma tutmadigi icin donguden cikip son okuduklarini yazdirmamasi gerekmez mi?

Aciklayabilirseniz sevinirim...


acehreli
31/03/2007, 01:17
Dogru dusunuyorsun. Eger dosyanin en sonundaki fazla karakterleri (ornegin satir sonu karakteri) kaldirirsan, sonuncu kayit yazilmayacak.

Ali

FoX_
31/03/2007, 02:39
Biraz kafam karisti acikcasi...:garip:

Ayni kodu su sekilde degistirelim ve .txt dosyamizin son satirindan sonra Enter'a basildigini dusunelim...

Bu sekilde asagidaki kod son satiri iki kere yazdiriyor.


1. satiri okudu ,yazdi sonunda \n oldugu icin devam etti.
2. satiri okudu ,yazdi sonunda \n oldugu icin devam etti.
3. satiri okudu ,yazdi sonunda \n oldugu icin devam etti.

Simdi 3.satirin sonunda \n oldugu icin alt satirdan devam edecek dediginizden anladigim kadariyla.
Ama alt satirda bir sey yok ki???
Neden tekrar 3. satiri yazdiriyor???



while(!feof(fPtr)){




fscanf(fPtr,"%s",ogrIsim);
fscanf(fPtr,"%s",ogrSoyAd);
fscanf(fPtr,"%d",&not1);



printf("%s ",ogrIsim);
printf("%s ",ogrSoyAd);
printf("%d ",not1);
printf("\n");



}


fclose(fPtr);
printf("Goruntuleme islemi bitti.\nYeni kayit icin (y), goruntuleme icin (g), cikis icin (c)\n");


}

acehreli
01/04/2007, 00:14
Son seferde, dosya sonunda olmadigimiz icin while'in icine giriyoruz.

Birinci fscanf, ogrIsim'in icine karakterler okumak istiyor. Basarisiz oldugunu gostermek icin 0 dOsndUruyor ama kimse bunu dikkate almiyor. :)

Artik bu noktada dosya sonundayiz, cunku fscanf bosluk karakterlerini yiyip yokeder.

Sonraki iki fscanf de basarisiz oluyorlar ve onun icin ogrSoyAd ve not1'in icine bir sey koyamiyorlar.

Biz hicbir basarisiz durumu denetlemedigimiz icin, gidip o uc tane nesneyi yazdiriyoruz. Onlarin icinde de bir onceki dOngUde okunan degerler oldugu icin ayni degerleri goruyoruz.

Yapilmasi gereken, her bir fscanf'in basarili olup olmadigina da bakmaktir. Aksi taktirde yanlis bilgi de verebiliriz. Ornegin son satiri eksik birak; not1 okuyamasin... Bir onceki dOngUnun not1'inin yazildigini goreceksin.

Ali

FoX_
01/04/2007, 06:21
Tesekkurler.Anladim sorunu.Bir sorum olursa tekrar sorarim...;)