انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: سید وحید رضا برهانی در 10 دی 1387، 04:06 قظ
-
سلام
من یک کد(سی یا پایتون) می خواستم که بتونه :چند تا فایل متنی بگیره ویک فایل بده بیرون (اینجاش زیاد سخت نیست)حالا این چند تا فایلی رو که گرفت بره توش وشروع کنه به جست و جو به این صورت که کلمه ی اولی (هر کلمه بین دو تا فاصله قرار داره مثل زبان انگیسی به غیر از کلمه ی اولی!)رو در کل فایل های وارد شده دنبال کنه و بشماره و تا آخر روی همه ی کلمات همین کارو انجام بده و در آخر نتیجه ی کارو به صورت کلمه ی جست وجو شده و تعداد ان کلمه در یک فایلی ذخیره کنه تموم شد!!و یک چیز اگر مایل بودید توضیح کوچیکی هم بدید که بعدا" ازش سر در بیارم
ممنون
-
همهی اینها تابع داره. هم در C هم در اسکریپت.
-
چه خوب می شه بیشتر بگه یا راهنمایی کنی یا مثال بزنی ؟
-
به قول دوستان:
RTFM
و
google it
-
یه نمونه سادشو برات نوشتم اینو نگاه کن ایده بگیر .چون گفتی با چند تا فایل مشکلی نداری این کد رو برای یک فایل ورودی نوشتم.
فرض من بر این بوده که حداکثر تعداد کلمات unique که در فایل استفاده شده 100 تاست. من برای ساختن دیکشنری از فایل استفاده نکردم و فقط یه بافر تعریف کردم اگر خواستی خودت عوضش کن. و حداکثر طول هر خط رو 100 کاراکتر با احتساب کاراکتر خط جدید در نظر گرفتم و حداکثر طول هر کلمه 25 کاراکتر با احتساب NULL . جدا کننده های کلمات هم (n\,. ) یعنی "نقطه کاما فاصله و کاراکتر خط جدید"
خروجی رو هم فقط روی صفحه نشون میده و توی فایل نریختم.
#include <string.h>
#include <stdio.h>
#define MAX_WORDS 100
void insertUW(char *string);
int searchUW(char *string);
void printUW(void);
int uwc=0; //Keeps The Number Of Unique Words Already found.(Unique Word Counter)
struct uwss //Unique Word Status Structure
{
char uw[25];
int no;
}uws[MAX_WORDS];
int main(int argc,char *argv[])
{
FILE *in;
if(argc > 1)
{
if((in = fopen(argv[1],"r"))==NULL)
{
printf("The file \"%s\" not found.\n",argv[1]);
return 0;
}
}
else
{
printf(" Pleas enter a file name.\n");
printf(" Usage: extract filename\n");
return 0;
}
char string[100]; //Assume the maximum length of a line 100 characters
const char delimiters[] = " .,\n"; //word delimiters
char *token;
while(fgets(string,100,in)!=NULL)
{
token = strtok (string, delimiters);
while(token!=NULL)
{
insertUW(token);
token = strtok (NULL, delimiters);
}//end of while
}//end of while
printUW();
return 0 ;
}
void insertUW(char *string)
{
int index=searchUW(string);
strncpy(uws[index].uw,string,25);
uws[index].no++;
if(index==uwc)
uwc++;
}
int searchUW(char *string)
{
int i;
if(uwc!=0)
for(i=0;i<uwc;i++)
if((strncmp(uws[i].uw,string,25))==0)
return i;//end of if-for-if
return uwc;
}
void printUW(void)
{
int i,j;
for(i=0;i<uwc;i++)
{
printf("------------------------------------\n");
printf("%d) %s ",i+1,uws[i].uw);
for(j=0;j<(26-strlen(uws[i].uw));j++)
printf(" ");//end of for
printf("(%d)\n",uws[i].no);
}//end of for
}
نمونه فایل ورودی :
behnam@ubuntu:~/Desktop/fdg$ cat c.txt
ubuntu,linux.ubuntu iran ubuntu linux
. .. .. ,, , , ubuntu linux behnam
behnam iran,linux.
نتیجه :
behnam@ubuntu:~/Desktop/fdg$ ./extract c.txt
------------------------------------
1) ubuntu (4)
------------------------------------
2) linux (4)
------------------------------------
3) iran (2)
------------------------------------
4) behnam (2)
-
ممنون برم کامپایل کنم ببینم چی می شه
-
خواهش میکنم.منتظر نتیجه هستم.
-
سلام یک جاشو نمی فهمم :اون صده مگه تعداد کلمات متفاوت رو تعیین نمی کنه (پس باید تو نتایجش از 100 کلمه بیشتر نداشته باشه در حالی که در بعضی فایل ها بیشتر میشه؟)و یک چیز دیگه چرا وقتی 100 رو می کنه 300 کلا" خرو جیش بهم می ریزه؟(پیچیده تر از اونی بود که فکر می کردم)
-
خوب برای اینکه من کنترل نکردم که اگر خواست از 100 بیشتر بشه برنامه چه عکس العملی نشون بده و چون داریم از اشاره گر (همون اسم آرایه) استفاده می کنیم در محدوده هایی نوشته میشه که مجاز نیست. میتونی با یه if مقدار uwc رو با 100 مقایسه کنی و در صورت رسیدن به 100 از حلقه while بیای بیرون. من 100 رو به 300 هم تغییر دادم ولی مشکلی نبود! دقیق تر توضیح بده و خروجی بذار .
-
سلام نمی دونم چرا ولی تو ویندوز کامپایل کردم وهیچ مشکلی نداشت
-
:o نمیدونم والا من تو اوبونتو و سوزه کامپایل کردم مشکلی پیش نیومد...
-
سلام این خروجی رو نگاه کن فایل ورودیش سورس برنامه است
http://negarsoft.persiangig.com/q.txt
-
فکر کنم تفاوت در کد اسکی کاراکتر خط جدید در ویندوز و لینوکس باشه ، خروجی برای من اینطوریه :
1) #include (2)
------------------------------------
2) <string (1)
------------------------------------
3) h> (2)
------------------------------------
4) <stdio (1)
------------------------------------
5) #define (1)
------------------------------------
6) MAX_WORDS (1)
------------------------------------
7) 300 (1)
------------------------------------
8) void (4)
------------------------------------
9) insertUW(char (2)
------------------------------------
10) *string); (2)
------------------------------------
11) int (8)
------------------------------------
12) searchUW(char (2)
------------------------------------
13) printUW(void); (1)
------------------------------------
14) uwc=0; (1)
------------------------------------
15) //Keeps (1)
------------------------------------
16) The (1)
------------------------------------
17) Number (1)
------------------------------------
18) Of (1)
------------------------------------
19) Unique (1)
------------------------------------
20) Words (1)
------------------------------------
21) Already (1)
------------------------------------
22) found (2)
------------------------------------
23) (Unique (1)
------------------------------------
24) Word (2)
------------------------------------
25) Counter) (1)
------------------------------------
26) struct (1)
------------------------------------
27) uwss (1)
------------------------------------
28) //Unique (1)
------------------------------------
29) Status (1)
------------------------------------
30) Structure (1)
------------------------------------
31) { (11)
------------------------------------
32) char (5)
------------------------------------
33) uw[25]; (1)
------------------------------------
34) no; (1)
------------------------------------
35) }uws[MAX_WORDS]; (1)
------------------------------------
36) main(int (1)
------------------------------------
37) argc (1)
------------------------------------
38) *argv[]) (1)
------------------------------------
39) FILE (1)
------------------------------------
40) *in; (1)
------------------------------------
41) if(argc (1)
------------------------------------
42) > (1)
------------------------------------
43) 1) (1)
------------------------------------
44) if((in (1)
------------------------------------
45) = (4)
------------------------------------
46) fopen(argv[1] (1)
------------------------------------
47) "r"))==NULL) (1)
------------------------------------
48) printf("The (1)
------------------------------------
49) file (2)
------------------------------------
50) \"%s\" (1)
------------------------------------
51) not (1)
------------------------------------
52) \n" (1)
------------------------------------
53) argv[1]); (1)
------------------------------------
54) return (5)
------------------------------------
55) 0; (2)
------------------------------------
56) } (7)
------------------------------------
57) else (1)
------------------------------------
58) printf(" (3)
------------------------------------
59) Pleas (1)
------------------------------------
60) enter (1)
------------------------------------
61) a (2)
------------------------------------
62) name (1)
------------------------------------
63) \n"); (1)
------------------------------------
64) Usage: (1)
------------------------------------
65) extract (1)
------------------------------------
66) filename\n"); (1)
------------------------------------
67) string[100]; (1)
------------------------------------
68) //Assume (1)
------------------------------------
69) the (1)
------------------------------------
70) maximum (1)
------------------------------------
71) length (1)
------------------------------------
72) of (6)
------------------------------------
73) line (1)
------------------------------------
74) 100 (2)
------------------------------------
75) characters (1)
------------------------------------
76) const (1)
------------------------------------
77) delimiters[] (1)
------------------------------------
78) " (2)
------------------------------------
79) \n"; (1)
------------------------------------
80) //word (1)
------------------------------------
81) delimiters (1)
------------------------------------
82) *token; (1)
------------------------------------
83) while(fgets(string (1)
------------------------------------
84) in)!=NULL) (1)
------------------------------------
85) token (2)
------------------------------------
86) strtok (2)
------------------------------------
87) (string (1)
------------------------------------
88) delimiters); (2)
------------------------------------
89) while(token!=NULL) (1)
------------------------------------
90) insertUW(token); (1)
------------------------------------
91) (NULL (1)
------------------------------------
92) }//end (3)
------------------------------------
93) while (2)
------------------------------------
94) printUW(); (1)
------------------------------------
95) 0 (1)
------------------------------------
96) ; (1)
------------------------------------
97) *string) (2)
------------------------------------
98) index=searchUW(string); (1)
------------------------------------
99) strncpy(uws[index] (1)
------------------------------------
100) uw (2)
------------------------------------
101) string (2)
------------------------------------
102) 25); (1)
------------------------------------
103) uws[index] (1)
------------------------------------
104) no++; (1)
------------------------------------
105) if(index==uwc) (1)
------------------------------------
106) uwc++; (1)
------------------------------------
107) i; (1)
------------------------------------
108) if(uwc!=0) (1)
------------------------------------
109) for(i=0;i<uwc;i++) (2)
------------------------------------
110) if((strncmp(uws[i] (1)
------------------------------------
111) 25))==0) (1)
------------------------------------
112) i;//end (1)
------------------------------------
113) if-for-if (1)
------------------------------------
114) uwc; (1)
------------------------------------
115) printUW(void) (1)
------------------------------------
116) i (1)
------------------------------------
117) j; (1)
------------------------------------
118) printf("----------------- (1)
------------------------------------
119) printf("%d) (1)
------------------------------------
120) %s (1)
------------------------------------
121) i+1 (1)
------------------------------------
122) uws[i] (2)
------------------------------------
123) uw); (1)
------------------------------------
124) for(j=0;j<(26-strlen(uws[ (1)
------------------------------------
125) uw));j++) (1)
------------------------------------
126) ");//end (1)
------------------------------------
127) for (2)
------------------------------------
128) printf("(%d)\n" (1)
------------------------------------
129) no); (1)
میتونی توی گوگل بگردی ، این رو ببین :
http://www.linuxforums.org/forum/misc/112428-new-line-character-windows-linux.html
با notepad که فایل رو باز میکنی تمام خطوط رو با هم ترکیب میکنه ؟ اگر اینطوریه فکر کنم با ورد آفیس یا اپن آفیس خودمون بازش کنی اولش یه پیغام برای تبدیل فرمت بهت بده . همونی که چند تا گزینه CR و CR&LF و LF بهت میده. یا اینکه خودت دستی درستش کنی.
-
تو ویندوز دزست عمل می کنه فقط در لینوکس مشکل داره(اونم وقتی که عدده از 100 بیشتر می شه)
-
این خروجی که گذاشتم رو توی اوبونتو گرفتم و همونطور که میبینی عدد هم از 100 بیشتر شده البته من مقدار ماکزیمم رو به 300 تغییر دادم. حالا زیاد در بند این کد نباش ، اینو همینطوری نوشتم که ازش ایده بگیری و کد خودتو بنویسی ، این کد خیلی اشکالات داره حداقل اگر نمیخوای یکی دیگه بنویسی سعی کن همین رو رفع اشکال کنی.و سعی کنی بهینه بکنیش. اگر در مورد منطق برنامه مشکل داشته باشی در خدمتم.