16 Temmuz 2013 Salı

C de dosya okuma işlemleri

Örnek: Verilen bir text'teki satır,kelime ve cümle sayılarının bulunması

Kod Açıklaması:

       Programda öncelikle bir giriş.txt isimli bir dosya oluşturduk. Daha sonra bir struct oluşturup içinde kelime, cümle, satır ve linked kullanımı için next adlı struct oluşturduk. Bu struct ı ise say adlı bir değişken ile p adlı bir pointer la devam ettirdik. Her linked kullanımı her paragraf için ayrı olmuştur. Yani bir diğer paragrafı incelemek için konsola p=p->next komutu vererek diğer alanımıza geçtik. Paragraflardaki cümle sayımlarını ‘.’ karakterlerini sayarak rahatlıkla bulduk. Daha sonra kelime sayılarını ise boşluk sayısından ve satır indiren ‘enter’ komutlarının yardımıyla bulduk. Yöntemimiz her satırda boşluk sayısının bir fazlası kadar kelime olmasıdır. Ayrıca alt satıra geçmek de bir boşluk bırakmak anlamına geldiği için bunu da göz önüne almayı unutmadık. Satır sayılarını da paragraftaki ‘\n’ karakterini araştırıp bulduk. Paragraf sayılarını bulmak için de üst üste olan iki tane ‘\n’ karakterlerini araştırarak saydık. Paragraflardaki non-alpha kelimelerini bulmak için bir yöntem kullandım fakat kodun çıkmaza girmesi sonucu o kısmını ekleyemedim. Yöntemi kısaca açıklamak istersek:
1-Öncelikle iki adet dizi gerekli(a[] ve b[] şeklinde). İkisinin de boyutu paragraflardaki boşluk sayısı kadar olmalı.
2-Dosyamızdaki karakterleri tek tek okurken her boşluktan sonra a[i] dizisinin indisi bir artırılmalı sonucu indisine eşitlenmeli.
3-Bu işlemler yapılırken ise boşluk karakteri bulunana kadar alfabetik olmayan karakter bulununca b[i] dizisinin kendisi, boşluk karakteri bulununca ise b[i] dizisinin indisi bir arttırılıp aynı zamanda da yeni dizi sıfırlanır.
4- Değerlendirmeyi ise dizilerin indisleri aynı iken b dizisi sıfırdan farklı ise bu alfabetik olmayan kelime olduğu anlamına geldiğini düşünüp ona göre sayım yaparız.

Örneğin Kodu:

#include <stdio.h>
#include <stdlib.h>
struct SAYAC{
       int kelime;
       int satir;
       int bosluk;
       int cumle;
       int nonalpha;
       struct SAYAC *next;
};
int main(int argc, char *argv[])
{FILE *deneme;
struct SAYAC *p;
struct SAYAC say={0,0,0,0,0,NULL};
p=&say;
int paragraf,i,x,topcumle=0,topkelime=0,topsatir=0;
p->satir=0;
p->cumle=0;
p->bosluk=0;
int karakter;
deneme=fopen("giris.txt","r");
if(deneme==NULL)
{                 printf("Dosya acılırken hata olustu!!\n Programdan cikiliyor!!");
                 exit(1);
}

putchar(karakter=getc(deneme));                   
while(!feof(deneme))
{
                    if(karakter=='.'){
                                      p->cumle++;
                                      } 
                    if(karakter==' '){
                                      p->bosluk++;
                                      } 
                    if(karakter=='\n'){
                                       paragraf++;
                    if(paragraf==2)
                    {
                                   p->next=(struct SAYAC*)calloc(1,sizeof(struct SAYAC));
                                   p=p->next;
                                   p->satir=0;
                                   p->cumle=0;
                                   p->kelime=0;
                                   p->bosluk=0;
                    
                    } 
                    else
                    { 
                                       p->satir++;
                    }
                    } 
                    else{
                                      paragraf=0;
                    } 
                                        
                    putchar(karakter=getc(deneme));
}
p=&say;
printf("\n\n1. paragraf \n");
p->bosluk=p->bosluk+p->satir-1;
p->kelime=p->bosluk+1;
topsatir=p->satir;
topcumle=p->cumle;
topkelime=p->kelime;
 printf("\nSatir: %d",p->satir);
              printf("\nKelime sayisi: %d\n",p->kelime);
              printf("Cumle sayisi: %d\n\n",p->cumle);
x=2;
p=p->next;
while(p!='\0')
{             printf("%d. paragraf\n",x);
              p->bosluk=p->bosluk+p->satir;
              p->kelime=p->bosluk;
              topsatir=p->satir+topsatir;
              topcumle=p->cumle+topcumle;
              topkelime=p->kelime+topkelime;
              printf("\nSatir: %d",p->satir);
              printf("\nKelime sayisi: %d\n",p->kelime);
              printf("Cumle sayisi: %d\n\n",p->cumle);
              p=p->next;
              x++;
}
printf("TOPLAM\nSatir: %d\nKelime: %d\nCumle: %d\n",topsatir,topkelime,topcumle);
fclose(deneme);
system("PAUSE");  
  return 0;
}

Örnek ve Ekran Çıktısı:






Hiç yorum yok:

Yorum Gönder