BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C örnek kodlar > c_ornek00005

C örnek kodlar

Bir metin dosyasında bir karakter dizisinin başlangıç sırasını bulma

Aşağıdaki program, oluşturduğu bir metin dosyasına 20000 adet karakter yazar. Dosyanın başlangıcından itibaren 300.byte konumunu aktifleştirdikten sonra, aynı konuma "Aranan karakter dizisi" ifadesini yazar ve dosyayı kapatır. Sonra getStrIndexFromFile() fonksiyonu ile dosya boyutunu alır, bu boyutun bir fazlası değerde dinamik bellek tahsisi yaparak, fread() fonksiyonu ile dosyanın tamamını bir defada okur, dosyadan okunan karakter sayısını ekrana yazar. Dosyanın içeriğinde strstr() fonksiyonu ile dosyaya kaydedilen karakter dizisinin başlangıç bellek adresini alır. Dizi başlangıç bellek adresi ile dosya başlangıç adresinin farkını alarak strindex değişkenine atar ve fonksiyonun geri döndürdüğü bu değeri ekrana yazar.


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

long int getStrIndexFromFile(const char* file, const char* str);

int main(void)
{
  FILE *fp;
  int id;
  char cdizi[25];
  long int strindex=0;

  /* Bir metin dosyası oluşturma */
  fp = fopen ("deneme.txt", "w");
  /* Metin dosyasına 1000 adet a karakteri yazma */
  for (id=0; id<20000; id++) fputc ('a', fp);

  /* Dosya başlangıcından itibaren 300.byte konumunu aktifleştirme */
  fseek(fp, 300, SEEK_SET);
  strcpy(cdizi, "Aranan karakter dizisi");
  /* Karakter dizisini dosyaya yazma */
  fwrite(cdizi, sizeof(cdizi), 1, fp);
  /* Dosya kapatma */
  fclose(fp);

  /* Karakter dizisinin dosyadaki başlangıç adresini alma */
  strindex = getStrIndexFromFile("deneme.txt", cdizi);
  if (strindex!=-1) {
      printf("Karakter dizisinin dosyadaki başlangıç adresi: %ld", strindex);
  }
  else printf("Karakter dizisi dosyada bulunamadı!");

  return 0;
}

long int getStrIndexFromFile(const char* file, const char* str)
{
  FILE *fp;
  long int fsize=0, rsize=0;
  char *pfile, *pos;
  long int strindex=0;

  /* Dosyayı okuma için açma */
  fp=fopen(file, "r");
  /* Dosya sonuna erişme */
  fseek(fp, 0, SEEK_END);
  /* Dosyanın aktif konum yani dosya sonu değerini alma */
  fsize=ftell(fp);
  if(fsize==-1) return -1;
  /* Dosya aktif konumunu başa alma */
  fseek(fp, 0, SEEK_SET);
  pfile = (char *) malloc((fsize+1) * sizeof(char));
  rsize = fread (pfile, sizeof(char), fsize, fp);
  pfile[fsize] = '\0';

  printf("Dosyadan okunan karakter sayısı: %ld\n", rsize);

  pos = strstr(pfile, str);

  if(pos) {
     strindex = pos - pfile;
  }
  else strindex=-1;

  /* Dosya kapatma */
  fclose (fp);
  /* Bellek boşaltma */
  free(pfile);

  return strindex;
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

Dosyadan okunan karakter sayısı: 20000
Karakter dizisinin dosyadaki başlangıç adresi: 300