C de Text Dosyasındaki Kelimeleri Başka Bir Text Dosyasında Arama

volgan

Asistan
Katılım
6 Aralık 2010
Mesajlar
408
Reaksiyon puanı
1
Puanları
0
(C de) 1. Text dosyasındaki kelimeleri 2.text dosyasındaki kelimelerle karşılaştırıp , 1. Text'teki kelimelerden hangilerinin 2. Text'te kaç kere olduğunu vermem gerekiyor.

Örn.
1.Text= .... Ali Veli ...
2.Text= Hasan Ali Ali Ahmet

-->Ali kelimesinden 2 tane var

Zor bir şey değil ancak kurduğum algoritmalar (linked liste atmak ,arrayda tutmak ,birini dizide tutup dosyada dolaşmak vs. vs..) kodu oldukça uzatıyor.
Yabancı sitelerin bazılarında bu işi kısmen gerçekleştiren(kelimeyi text te aramak gibi) çok kısa kodlar gördüm. Dosyalardan herhangi birini belleğe atmadan bu işlemi nasıl gerçekleştirebilirim?
 

kosasker

Profesör
Katılım
24 Aralık 2008
Mesajlar
3,195
Reaksiyon puanı
49
Puanları
48
Öyle bir şey yok. Belleğe atmadan, dosyayı okuyamazsınız.
 

fyodor

Asistan
Katılım
3 Temmuz 2009
Mesajlar
233
Reaksiyon puanı
2
Puanları
0
Dosyalarda ne kadar kelime olduğunu bilemezsin. Yani bu durumda dizi kullanamazsın çünkü dizi tanımlamadan önce boyutunu bilmen lazım. Sağlam bir bağlı liste yazman lazım. Bu listeye eleman eklenebilecek ve verilen bir elemandan kaç tane olduğunu bulacak iki tane fonksiyon yeter herhalde. Yani sorundan anladığıma göre listeden silme ya da listeyi sıralama yapılmayacak.
 

yetkilibiri

Profesör
Katılım
22 Ağustos 2008
Mesajlar
1,094
Reaksiyon puanı
7
Puanları
38
.text dosyasındaki her satırda tek kelime mi bulunuyor? (satır satır mı okuyorsun?)
yoksa bütün halinde mi? (boşluklardan mı split ediyorsun?)

Satır satır ise işin biraz daha kolay... Bana bunun cevabını ver, örnek bir kod yazarım.:yes:
 

volgan

Asistan
Katılım
6 Aralık 2010
Mesajlar
408
Reaksiyon puanı
1
Puanları
0
[MENTION=54792]kosasker[/MENTION] belleğe atmadan gayet okunuyor [MENTION=72032]fyodor[/MENTION] dinamik bellekle diziye atılabilir ama stringleri tutmak istemiyorum
[MENTION=39754]zQQm[/MENTION] satır satır olsa da olur, senin çözümün nasıl ?

şimdi dosyayı kaydetmeden arama yapabiliyorum ama bu sefer de kelime içinde küçük kelimeler buluyor (badana -> adana buluyor) biraz bakmam lazım
 

kosasker

Profesör
Katılım
24 Aralık 2008
Mesajlar
3,195
Reaksiyon puanı
49
Puanları
48
[MENTION=112768]volgan[/MENTION] Allah Allah... Belleğe atmadan bir dosya nasıl okunurmuş, kaynak kodunu yazın da, yanlış biliyormuşum diyeyim ve tebrik edeyim sizi.
 

yetkilibiri

Profesör
Katılım
22 Ağustos 2008
Mesajlar
1,094
Reaksiyon puanı
7
Puanları
38
textcaps.jpg


[MENTION=112768]volgan[/MENTION] bu resim işini görür umarım.
Şuan satır satır okuyor ama boşluktan bölme de yapabilirsin hiç farketmez... Ben acele bir şekilde yazdım düzeltirsin artık istediğin gibi...

https://rapidshare.com/files/837862488/zQQm_txtKontrolu.rar
 

LeaveNhA

Doçent
Katılım
4 Aralık 2011
Mesajlar
598
Reaksiyon puanı
5
Puanları
18
c++ deki her dosya okuma işlemi için bir akış nesnesi oluşturulur, bu akış nesnesine belirli argümanlar verilir, "işlenicek dosya yolu" relative yada absolute dizin olarak.
sonra efendime söyliyim, hangi işlemler yapmak istediğimiz, i/o. vs. vs.
yanlış biliyosam düzeltin, bu argümanları fantezist hayaller kurmak için istemiyor işletim sistemi.

ki işletim sistemi dosya ile ne yapmak istediğimizi bilmek istiyor.

verilen bilgiler karşılığında bellekten bir değer döner, ve dönen değer "bellek"'te bir yere işaret eder.
yani dosyanın bellekte saklandığı yere.

ben bi c++ programcısı olarak "hiç bir" dosyanın belleğe atılmadan okunmicağı fikri taşıyorum an itibari ile.
lütfen aksini kanıtlayında bütün fikirlerimi değiştireyim. :D
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
188
Puanları
63
Arkadaşın belleğe atılmadan okunuyor demesi de bununla ilgili sanırım. Arkadaş belleğe atmayı komple metni belleğe kopyalamak olarak algılamış olabilir. Kaldı ki bellekte dosyanın işareti olmadan zaten veri okunmaz. Çünkü bir programın yaptıgı her işlem bilgisayarın belleğine işaret atarak ya da çeşitli verileri saklayarak yapılır ve bunu zaten bir yere kadar programcı değil OS yönetir. Doğal olarak belleği atlayarak direkt dosyaya erişim mümkün değildir...
 

volgan

Asistan
Katılım
6 Aralık 2010
Mesajlar
408
Reaksiyon puanı
1
Puanları
0
son olarak ANCI c de bunu yazdım;
#include <stdio.h>#include <stdlib.h>
#include <string.h>


FILE *read2,*read;


int search_in_text(FILE*,char *line);


int main(int argsay, char *arg[])


{
read = fopen(arg[1],"r");


char input [500],*line,type='f';
char * insertline,*command;
int result=0;




if(argsay==4)
{
command=arg[3];
type=command[1];
}




do {


line = fgets(input,500,read);


if (line != NULL)
{insertline = strtok (line," \r\n");


while (insertline != NULL)
{


read2 = fopen(arg[2],"r");


result=search_in_text(read2, insertline);


fclose(read2);




if(result>0 && (strlen(insertline)>1))
{


if(type=='o')
{
printf("%s %d ",insertline, result);


}




else
{
printf("%s %d\n",insertline, result);
}
}


insertline = strtok (NULL," \r\n");


}


}


} while (line!= NULL);


return 0;
}




int search_in_text(FILE *read2,char *insertline)
{
int number_w = 0;
char input2 [500],*line2;
char * insertline2;




do {
line2 = fgets(input2,500,read2);


if (line2 != NULL)
{
insertline2 = strtok (line2," &#9484;&#9496;ÏÎÍÈËʪº¤&#9580;&#9552;&#9568;&#9574;&#9577;&#9556;&#9562;Ãã&#9532;&#9472;&#9500;&#9516;&#9524;&#9492;&#9488;¥¢&#9565;&#9559;&#9553;&#9571;©ÀÂÁ&#9508;&#9474;&#9619;&#9618;&#9617;»«¡¼½¬®¿ğĞÑñúóíáØ£ø{&#8962;`&#9786;&#9787;&#9829;&#9830;&#9827;&#9824;•&#9688;&#9675;&#9689;&#9794;&#9792;&#9834;&#9835;&#9788;&#9658;&#9668;&#8597;&#8252;¶§&#9644;&#8616;&#8593;&#8595;&#8594;&#8592;&#8735;&#8596;&#9650;&#9660;`~@”“:||||;=¾½&%{}()[]+$<>*^#/_-!?...,'""&#145;&#146;&#147;&#148;&#151;&#133;\r\n"); //ayırmak istediğiniz karakterler


while (insertline2 != NULL)
{


if(strcmp(insertline,insertline2)==0)
++number_w;




insertline2 = strtok (NULL," &#9484;&#9496;ÏÎÍÈËʪº¤&#9580;&#9552;&#9568;&#9574;&#9577;&#9556;&#9562;Ãã&#9532;&#9472;&#9500;&#9516;&#9524;&#9492;&#9488;¥¢&#9565;&#9559;&#9553;&#9571;©ÀÂÁ&#9508;&#9474;&#9619;&#9618;&#9617;»«¡¼½¬®¿ğĞÑñúóíáØ£ø{&#8962;`&#9786;&#9787;&#9829;&#9830;&#9827;&#9824;•&#9688;&#9675;&#9689;&#9794;&#9792;&#9834;&#9835;&#9788;&#9658;&#9668;&#8597;&#8252;¶§&#9644;&#8616;&#8593;&#8595;&#8594;&#8592;&#8735;&#8596;&#9650;&#9660;`~@”“:||||;=¾½&%{}()[]+$<>*^#/_-!?...,'""&#145;&#146;&#147;&#148;&#151;\r\n"); //ayırmak istediğiniz karakterler
}




}




} while (line2!= NULL);




return number_w;
}





bunu kastetmiştim 1. dosyadan kelimeleri boşluk ya da yeni satıra göre ayırarak alır 2. dosyadaki stringleri karakterlere göre karşılaştırır çıktı olarak hangi kelimeden kaç tane olduğunu verir.
 
Üst