C ile Dosya İçinde Bir Kelimeden Kaç Tane Olduğunu Bulma

Başlık biraz uzun oldu ama aklıma daha kısa ve açıklayıcı bir başlık gelmedi. Bu kod ne işe yarar? Programa arama yapacağınız dosyanın adını ve aramak istediğiniz kelimeyi girdiğinizde, sonuç olarak size o dosya içerisinde, aradığınız kelimeden kaç tane olduğunu döndürür. Kodu aşağıya yazıyorum. Yorum satırlarında kabaca nasıl çalıştığı yazıyor ancak kısaca bir daha açıklayacağım.

Programın eksiklikleri :

  • Arama yapmak istediğiniz dosyanın var olup olmadığına bakmıyor. Dosya adını doğru girmelisiniz ve arayacağınız dosya ile uygulamanın exe uzantılı dosyası aynı yerde olmalı. Dosyanın olup olmadığı bir if yapısı ile kontrol edilebilir, ancak ben bununla uğraşmadım.
  • Eksiklik sayılabilir mi bilmiyorum ama arama yaparken büyük – küçük harfe duyarlı olarak arıyor. Örneğin “berk” diye aratırsanız “Berk” sözcüğünü bulmayacaktır. Bunu da karakterlerin eşitliğini kontrol ederken (isimlerini yanlış hatırlıyor olabilirim) “toupper” ve “tolower” fonksiyonlarına sokup öyle karşılaştırarak çözebiliriz sanırım. Bunu da denemedim.

Kod aşağıdadır :

/*
Bu program ile belirlediğiniz bir dosya içerisindeki istediğiniz kelimeyi arayabilir, sonuç olarak bu kelimeden
dosya içinde kaç tane olduğunu görebilirsiniz.

Berk Baykal
http://www.berkbaykal.com/blog
*/

#include <stdio.h>
#include <conio.h>
#include <string.h>

int keywordSayisi(FILE*, char[]);       // Fonksiyon prototipi

int main(void)
{
    FILE *fptr;                         // FILE pointer
    char keyword[20];                   // Aranacak keyword
    char dosyaAdi[30];                  // Aranacak dosyanın adı

    printf("Dosya adini girin : ");     // Dosya adını al - (buraya keyword.txt'yi girerseniz bu dosyada arama yapabilirsiniz.)
    scanf("%s", dosyaAdi);

    printf("Keyword girin : ");         // Keyword'u al
    scanf("%s", keyword);

    fptr = fopen(dosyaAdi, "r");        // Dosya okuma modunda açıldı

    printf("Dosyada bulunan keyword sayisi : %d", keywordSayisi(fptr, keyword));    // Pointer ve keyword fonksiyona gönderilerek
                                        // dönen değer ekrana yazılıyor.

    fclose(fptr);                       // Dosya kapatıldı.

     getch();
     return 0;
     }

int keywordSayisi(FILE *fptr, char keyword[])
{
    int kacKeywordVar = 0;                             // Kaç keyword bulunduğunu tutuyor.
    int i = 0;                                         // Keyword dizisi içinde gezinmek için
    char temp;                                         // Dosyadan o anda okunan karakteri tutuyor.

    while(!feof(fptr))                                 // Dosyanın sonuna gelene kadar dönecek.
    {
                fscanf(fptr, "%c", &temp);             // O anki karakteri temp değişkenine al
                if(keyword[i] == temp)                 // Eğer keywordun i. karakteri, tempe eşitse,
                {
                   if(i == strlen(keyword) - 1)        // ve eğer keywordun son karakteriyse bu eşit olan
                   {
                      kacKeywordVar++;                 // Keyword bulunmuş demektir. Bulunan keyword sayısını bir arttır.
                      i = 0;                           // Keywordun 0. karakterine yani başına dön.
                      }
                   else                                // Eğer aynı olan karakter, keywordun son karakteri değilse,
                      i++;                             // Bir sonraki karakterleri karşılaştırmak için i'yi bir arttır.
                }

                else                                   // Eğer dosyadan alınan karakterle temp eşit değil ise,
                      i = 0;                           // Keywordun 0. karakterine, yani başına dön.

    }

    return kacKeywordVar;                              // Bulunan keyword sayısını döndür.
    }

Programın çalışma mantığı karakter karakter karşılaştırmaya dayanıyor. Önce dosyadan sıradaki karakter alınıyor. Daha sonra aranan kelimenin i. karakteri ile karşılaştırılıyor. Eğer aynı iseler, i değeri bir arttırılıyor. Bu da bize dosyada sonraki harfe geçildiğinde, kelimede de sonraki harfe geçip bu iki harfin karşılaştırılmasını sağlıyor.

Eğer i değeri, anahtar kelimenin uzunluğundan bir eksikse (0’dan başladığı için), bu, kelimenin dosyada bulunduğu anlamına geliyor, ve kacKeywordVar değişkeni bir arttırılıyor.

Eğer dosyadan alınan karakter ile, kelimenin i. karakteri aynı değil ise, i = 0 yapılıyor. Böylece bir sonraki karşılaştırma, dosyadan gelen karakter ile kelimenin ilk karakteri arasında yapılıyor.

Aşağıdaki RAR dosyasında kodu, exe uzantılı uygulamayı, ve örnek bir keyword.txt’yi bulabilirsiniz. keyword.txt’nin içinde 500 kelimelik bir “Lorem ipsum” bulunuyor.

http://berkbaykal.com/upload/dosyaArama.rar

Share

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>