[Çözüldü] EOF sorunu

Başlatan Ali Osman, 12 Ocak 2017 - 13:00:41

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Ali Osman

        İki tane metin dosyam var. İlkinde kelimeler ikincisinde ise eşanlamlıları var. Örneğin ilk dosyada 3 kelime olsun. Al, Ak, Siyah. Ve ikinci dosyada da bunların karşılığı olan Kırmızı, Beyaz, Kara var. Her biri bir satır. Önce kelimeler dosaysından bir satır okuyor. Ve aşağıdaki while döngüsüne girip açıklamalar dosyasından bir satır okuyor. Tüm satırlar bitene kadar böyle devam ediyor. Şimdi, eğer satır sayısı belli ise dış döngüdeki while parantezinde eleman sayısını kontrol ediyorum ve program sorunsuz çalışıyor. Ama satır sayısı belli değilse dosya sonunda döngüden çıkılsın istiyorum fakat bir türlü EOF'ye göre kontrol ettiremedim. Aşağıda //********   //******* arasındaki kodları şu şekilde değiştirdiğimde sorun olmaması lazım diye düşünüyorum fakat çalışmıyor.
while((ck=fgetc(fk))!=EOF){
    i=0;
        while(ck!='\n')
                 geciciKelime[i++]=ck;

    int ck, ca;  //dosyalardan okunan karakterlerin tutulacağı değişken
    int i=0; //geciciDizin indexi
    int elemanSayisi=0; //Veritabanındaki satır sayısını tutar
    char yazi[10]=""; //Kullanıcıdan anlamının bulunmasını istediği kelimeyi alır
    char geciciKelime[10]="";
    char geciciAciklama[10]="";
    FILE *fk, *fa; //Dosya türünden göstericiler

    fk=fopen("ke","r");
    fa=fopen("ac","r");
    if(!fk)
        printf("Kelimeler dosyası açılamadı");
    else if(!fa)
        printf("Açıklamalar dosyası açılamadı");
    else
//************************************************
    while(elemanSayisi++<75){
    i=0;
//----- kelime dosyasındaki kayıtlar alınıyor-----------------
        while((ck=fgetc(fk))!='\n')
                 geciciKelime[i++]=ck;
**************************************************
//------- aciklamalar dosyasındaki kayıtlar alınıyor--------
    i=0;
        while((ca=fgetc(fa))!='\n')
                 geciciAciklama[i++]=ca;
     printf("%s %s",geciciKelime, geciciAciklama);
     for(i=0;i<10;++i)
{
         geciciKelime[i]=0;
         geciciAciklama[i]=0;
}
    }
    fclose(fk);
    fclose(fa);

Erdem

Verileri dosyaya yazarken biçimli şekilde dosyaya yazsan daha kolay olmaz mı. Örneğin:

Al: Kırmızı
Ak: Beyaz
Siyah: Kara

Eof kullanmak için de C'de kullanım şuna benzer sanırım.

int c;
while ((c = fgetc(akım)) != EOF)
{
    // c'yi işle
}
if (feof(akım))
{
    // dosya sonuna geldik
}
else
{
    // başka bir hata yüzünden okuyamıyoruz
}

Ali Osman

içteki ikinci while'den sonra şu kontrolu yapınca oldu.

if(fgetc(fp)==EOF) 
            break;           
        fseek(fp,-1,SEEK_CUR);

Erdem

#3
İlk gösterdiğin yöntem programcının umduğu gibi çalışmıyor sanırım. Bunu örnekleyen bir program:

#include <stdio.h>

int main(void)
{
  int i = -1;
  signed char isaretliKarakter = 0xff;
  unsigned char isaretsizKarakter = 0xff;
   
  printf ("%x\'ı  %x ile karşılaştırıyorum\n", i, isaretliKarakter);
  if (i == isaretliKarakter)    puts("i == işaretli char");
  else            puts("i != işaretli char");
  putchar ('\n');
  printf ("%x\'ı %x ile karşılaştırıyorum\n", i, isaretsizKarakter);
  if (i == isaretsizKarakter)   puts("i == işaretsiz char");
  else            puts("i != işaretsiz char");

  return 0;
}


Uzun açıklamasını da buradan okuyabilirsin.



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 13 Ocak 2017 - 21:14:35

Alıntı yapılan: Erdem - 13 Ocak 2017 - 17:32:38
İlk gösterdiğin yöntem programcının umduğu gibi çalışmıyor sanırım. Bunu örnekleyen bir program:
[..]

Burada bir hata yapmışım. Bu durum örneğin karakterler için int yerine char kullanınca ortaya çıkıyor. Gördüğüm kadarıyla senin programında böyle bir durum yok.

Hatalı tasarıma bir örnek:

#include <stdio.h>

int main(void)
{
    int karakter;

    FILE * kutuk;
    kutuk = fopen("deneme.txt", "r");

    while (karakter != EOF)
    {
        karakter = getc(kutuk);
        putchar(karakter);
    }

    return 0;
}


Örneğin burada karakter EOF ile karşılaştırılıyor ama henüz bir değer atanmamış. İkinci problem ise eğer getc() EOF değerini döndürürse , döngü EOF'u sanki geçerli bir karakter gibi yorumlayacaktır.

Bunu düzeltmek için

#include <stdio.h>

int main(void)
{
    int karakter;

    FILE * kutuk;
    kutuk = fopen("deneme.txt", "r");

    karakter = getc(kutuk);     // ilk girdiyi al
   

    while (karakter != EOF)
    {
        putchar(karakter);
        karakter = getc(kutuk); // bir sonraki girdiyi al

    }

    return 0;
}


Ya da karakter = getc(kutuk) senin programında olduğu gibi while( içine) taşınabilir.

Ali Osman

Erdem hocam; o şekilde çok denedim ama iç içe while döngüleri olduğu zaman hiç biri olmadı. Galiba tek çare içteki döngü bloğu içinde kontrolü yapmak.

Erdem

Alıntı yapılan: Erdem - 13 Ocak 2017 - 17:32:38
[...]
Ya da karakter = getc(kutuk) senin programında olduğu gibi while( içine) taşınabilir.

İşte taşıdığımız zaman da şunun gibi olmuş oluyor.

#include <stdio.h>

int main(void)
{
    int karakter;

    FILE * kutuk;
    kutuk = fopen("deneme.txt", "r");

    while ((karakter = getc(kutuk)) != EOF)
    {
        putchar(karakter);

    }

    return 0;
}