C Programlama-Sonuncu Veriyi 2. Kere Neden Okuyor ?
-
Dosyadaki son veriyi iki kere ekrana yazdırıyor burada dosya işaretçisi ile ilgili bilmediğim bir şey var sanırım sizce neden 2 kere okuyor ?
#include <stdio.h> #include <stdlib.h> struct yapi{ int hesapno; char soyisim[30]; char isim[10]; double bakiye; }; typedef struct yapi abc; int main() { FILE *cptr; abc musteri={0,"","",0.0}; if((cptr=fopen("kredi.txt","r"))==NULL) printf("Dosya Acilamadi\n"); else { printf("%-10s%-11s%-11s%-6s\n","Hesap No","Soyisim","Isim","Bakiye"); while(!feof(cptr)) { fread(&musteri,sizeof(struct yapi),1,cptr); if (musteri.bakiye!=0) printf("%-10d%-11s%-11s%-6.2f\n", musteri.hesapno,musteri.soyisim,musteri.isim,musteri.bakiye); } fclose(cptr); } return 0; } -
#include <stdio.h> #include <stdlib.h> struct yapi { int hesapno; char soyisim[30]; char isim[10]; double bakiye; }; typedef struct yapi abc; int main() { FILE *cptr = 0; abc musteri = {0, "", "", 0.0}; if( ( cptr = fopen("kredi.txt", "r") ) == NULL ) { printf("Dosya Acilamadi\n"); } else { printf("%-10s%-11s%-11s%-6s\n", "Hesap No", "Soyisim", "Isim", "Bakiye"); while( !feof(cptr) ) { if (fread(&musteri, sizeof(struct yapi), 1, cptr) != 1) { break; } if (musteri.bakiye != 0) { printf("%-10d%-11s%-11s%-6.2f\n", musteri.hesapno, musteri.soyisim, musteri.isim, musteri.bakiye); } } fclose(cptr); } return 0; } -
Hocam veri bittiği zaman bir daha fread çağırdığın zaman dosyanın sonuna geldiğini anlıyorsun.İlk veriyi while a girmeden okursan sorun kalmayacaktır diye düşünüyorum yanılıyorsam düzeltin lütfen kodu da ekliyorum.
#include <stdio.h> #include <stdlib.h> struct yapi{ int hesapno; char soyisim[30]; char isim[10]; double bakiye; }; typedef struct yapi abc; int main() { FILE *cptr; abc musteri={0,"","",0.0}; if((cptr=fopen("kredi.txt","r"))==NULL) printf("Dosya Acilamadi\n"); else { printf("%-10s%-11s%-11s%-6s\n","Hesap No","Soyisim","Isim","Bakiye"); fread(&musteri,sizeof(struct yapi),1,cptr); while(!feof(cptr)) { if (musteri.bakiye!=0) printf("%-10d%-11s%-11s%-6.2f\n", musteri.hesapno,musteri.soyisim,musteri.isim,musteri.bakiye); fread(&musteri,sizeof(struct yapi),1,cptr); } fclose(cptr); } return 0; }OnLyGoDCaNStoPMe tarafından 18/Mar/13 14:09 tarihinde düzenlenmiştir -
Nedenini anlayamadım mesela sıradan erişimli bir dosya için
...
fscanf(fptr,"%d%d%d",°1,°2,°3);
while (!feof(cptr))
{
printf("%d %d %d",deg1,deg2,deg3);
fscanf(fptr,"%d%d%d",°1,°2,°3);
}
...
türünden olunca son veriyi iki kez almıyor ama ilk veriyi dışaarda almazsak yani while içinde okur yazarsak sonuncu veriyi 2 kere ekrana basıyor peki NEDEN NEDEN NEDEN bunu yapıyor.
Resmen saatlerdir bunu soruyorum ve öğrenemedim bu hızla zor biter bu C :(
-
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1046476070 adresinde bu gibi durumlarda dosya sonunu öğrenmek için neden feof kullanmamamız gerektiği yazıyor. Biraz daha düzeltilmiş bir örnek:
#include <stdio.h> #include <stdlib.h> struct yapi { int hesapno; char soyisim[10]; char isim[10]; double bakiye; }; typedef struct yapi abc; int main() { FILE *cptr = 0; abc musteri = {0, 0, 0, 0.0}; //veri olusturma if( ( cptr = fopen("kredi.txt", "wb") ) == NULL ) { printf("Dosya acilamadi!\n"); return -1; } int t = 0; for(; t < 100; ++t) { musteri.hesapno = t+1; int f = 0; for ( ; f < 9; ++f) { int tmp = ((t % 65) + 65); musteri.soyisim[f] = tmp; musteri.isim[f] = tmp; } musteri.soyisim[9] = '\0'; musteri.isim[9] = '\0'; musteri.bakiye = (t+1) * t / 6.75; fwrite (&musteri, sizeof(struct yapi), 1, cptr ); } fclose(cptr); cptr = NULL; //veri olusturma bitti //veri okuma if( ( cptr = fopen("kredi.txt", "rb") ) == NULL ) { printf("Dosya acilamadi!\n"); return -1; } printf("%-10s%-11s%-11s%-6s\n", "Hesap No", "Soyisim", "Isim", "Bakiye"); while( fread(&musteri, sizeof(struct yapi), 1, cptr) ) { //if (musteri.bakiye > 10 && musteri.bakiye < 2500) { printf("%-10d%-11s%-11s%-6.2f\n", musteri.hesapno, musteri.soyisim, musteri.isim, musteri.bakiye); } } fclose(cptr); //veri okuma bitti system("pause"); return 0; }YeniHarman tarafından 18/Mar/13 01:47 tarihinde düzenlenmiştir
