folder Tahribat.com Forumları
linefolder C - C++
linefolder C Programlama-Sonuncu Veriyi 2. Kere Neden Okuyor ?



C Programlama-Sonuncu Veriyi 2. Kere Neden Okuyor ?

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek

    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;
    }
    

    https://www.youtube.com/watch?v=WC3-71NKwPw
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    #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; 
    } 

    Olaylara karışmayın!
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    OnLyGoDCaNStoPMe
    OnLyGoDCaNStoPMe's avatar
    Kayıt Tarihi: 24/Mart/2010
    Erkek

    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
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek

    Nedenini anlayamadım mesela sıradan erişimli bir dosya için

    ...

    fscanf(fptr,"%d%d%d",&deg1,&deg2,&deg3);

    while (!feof(cptr))

    {

    printf("%d %d %d",deg1,deg2,deg3);

    fscanf(fptr,"%d%d%d",&deg1,&deg2,&deg3);

    }

    ...

    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 :(


    https://www.youtube.com/watch?v=WC3-71NKwPw
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    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

    Olaylara karışmayın!
Toplam Hit: 1921 Toplam Mesaj: 5