PDA

View Full Version : Random String از فایل.



saeedIRHA
شنبه 22 بهمن 1384, 06:34 صبح
سلام دوستان!
چطور میتونم از یک فایل Text که شامل چند تا String هست
یک String رو به صورت Random انتخاب کنم و Print کنم؟!؟!
ممنون!

mzjahromi
شنبه 22 بهمن 1384, 18:28 عصر
باید تمام استرینگ ها رو بخونی و تو یه آرایه از استرینگ نگه داری.
تعدادش رو هم داشته باشی.
بعد یه عدد راندم بین صفر تا اون عدد تولید کنی.
در آخر استرینگ اون خونه رو چاپ کنی.
این کار در صورتی امکان پذیر هست که تعداد رشته های درون فایل کم باشه.
یک راه کند تر اینهه که عدد رو از ورودی بگیری و به اندازه اون عدد رشته ها رو رد کنی (با تشخیص Delimiter یا هر چیزی که انتهای رشته ها رو مشخص می کنه.) و بعد رشته ابتدای Cursor رو چاپ کنی. برای اینکه عدد مورد نظرت از تعداد کل رشته ها بیشتر نشه میتونی از Mod استفاده کنی. ولی اگر محدوده عدد تصادفی ات از تعداد کل رشته ها کمتر باشه یه سری از رشته ها درون قرعه کشی( قرعه کشی، واکشی یا ... ) شرکت نمی کنن. این رو می تونی با یک بار شمردن کلیه رشته ها حل کنی

saeedIRHA
شنبه 22 بهمن 1384, 19:09 عصر
سلام دوستان.
مرسی از جوابتون!!مشکله من اینکه وقی String ها رو کپی میکنم تو یک آریه و میخوام بهشون
Random دسترسی داشته باشم هیچ وقت از اوله یک رشته شروع نمیکنه!!!!!!!
وقتی هم که تعداده رشته هارو می شمارم درست عمل میکنه و تعدادش رو درست بر میگردنه اما نمیدونم
چطور می توانم رشته اون شماره رو print کنم ؟!؟!

mzjahromi
شنبه 22 بهمن 1384, 19:15 عصر
سلام دوستان.
مرسی از جوابتون!!مشکله من اینکه وقی String ها رو کپی میکنم تو یک آریه و میخوام بهشون
Random دسترسی داشته باشم هیچ وقت از اوله یک رشته شروع نمیکنه!!!!!!!
وقتی هم که تعداده رشته هارو می شمارم درست عمل میکنه و تعدادش رو درست بر میگردنه اما نمیدونم
چطور می توانم رشته اون شماره رو print کنم ؟!؟!

مشکلتون رو دقیق تر بنویسید.
حجم رشته هاتون چقدره؟
جدا کننده رشته ها چیه؟
یعنی چی از اول رشته شروع نمیکنه؟
اگه از روشی که دوستمون گفتن بخوای استفاده کنی باید از آرایه ای از رشته ها استفاده کنی. اونوقت شماره رشته میشه اندیس آرایه. و هنگامی که میخوای آرایه رو پر کنی باید رشته ها رو از هم جدا کنی

saeedIRHA
یک شنبه 23 بهمن 1384, 00:39 صبح
من دارم یک برنامه مینویسم مثله بازی "HANG MAN"
که کارش اینه که میاد یک رشته رو از یک فایل Text میخونه بعد با توجه به طول رشته حروف رو به
صورت Random انتخاب میکنه و
"؟" علامت رو جا گذاری میکنه که کاربر حدس بزنی چی بوده اون کماله!
اصل کاری که میخوام بکنم اینه!
حالا تعداد رشته به طوره پیش فرض معلوم نیست.چون فایل میشه رشته بهش اضافه کرد.
طول رشته هم به طور پیش فرض معلوم نیست!
تنها چیزی که هست هر Line شامل یک رشته هست.
حالا من میخوام بدونم چطور میتونم یک رشته رو از این فایل Text به صورت تصادفی
بگیرم که بعد تغیرات امو اعمال کنم؟!

mzjahromi
یک شنبه 23 بهمن 1384, 08:26 صبح
به نظر من لازم نیست کل فایل رو بخونید و بریزید توی حافظه.
شما یک عدد رندوم دارید.
یک شمارگر رو مقدار 1 بهش بدید(N)
از اول فایل شروع کنید و کاراکترها رو یکی یکی یا چند تا چندتا بخونید.(یکی یکی ساده تره ولی چند تا چند تا سریعتره. برای کار شما فرقی نمیکنه) هر وقت به کاراکتر 13 رسیدی یکی به متغیرت اضافه کن(N)
هر وقت (N) شد به اندازه عدد رندومت شروع کن کاراکتر ها رو بریز درون یک رشته تا زمانی که دوباره به 13 برسی

saeedIRHA
یک شنبه 23 بهمن 1384, 11:26 صبح
سلام دوست عزیز!
مشکلی که هست اینکه
من یک بار فایل رو با تابع fgetc خوندم تا به کاراکتر "n\" برسم و اون وقت شمارنده رو یکی افزایش
دادم تا با مقداره عدد ی که random به دست اوردم یکی بشه اینا همه درست شد!
اما در این هنگام چطور من میتونم از اون عدد به بعد شروع کنم به Print کردن تا دوباره به "n\" برسم؟!
چون در این حالات نه میتونم از تابع fgetc استفاده کنم نه از fgets!
هیچ جور میتونم Pointer فایل رو یک جوری تنظیم کنم که از اونجایه که میخوام شروع کنه به چاپ کردن؟!
مرسی از توجهتون!

mzjahromi
یک شنبه 23 بهمن 1384, 11:42 صبح
شما وقتی که به آخرین \n رسیدی شروع کن به چاپ کردن.
یه چیزی شبیه به این:


c=fgetc
if N=randomvalue then
Printf(c)
if n>Randomvalue then
exit

غیر از این Pointer فایل رو با Fseek میتونی جابجا کنی.(البته تو C اگه C++ کار میکنی فرق می کنه)

saeedIRHA
یک شنبه 23 بهمن 1384, 21:02 عصر
سلام.
دوست عزیز این کارو کردم اما مسئله که هست اینه که در این کد C فقط یک بار پرینت میشه
و اصلاً Loop نمیکنه تا به "n\" برسه؟!؟!
این روش درست عمل نمکنه :-(

mzjahromi
یک شنبه 23 بهمن 1384, 21:06 عصر
دوست عزیز این یه شبه کد هست مسلما شما باید این رو بذارید توی حلقه. و بجای Exit بنویسید Break

saeedIRHA
دوشنبه 24 بهمن 1384, 04:51 صبح
سلام دوست عزیز!
اول از همه مرسی از راهنمایی تون!
بعد من سعی کردم این کارو بکنم اما نشد!!!یک سؤال عجیب هم اینجا برام پیش امد چون من
نمیتونم بطوره همزمان هم از fgets استفاده کنم هم از fgetc؟!؟!؟
یا 2 بار از fgetc به صورته هم زمان!
میشه دلیل این مسئله رو توضیح بدین ؟!برای اینکه بتونم از هردو تابع استفاده کنم باید یک بار
fclose کنم و دوباره fopen کنم!!
میشه دلیش رو توضیح بدین؟!
اگر من بخوام اینو تو loop بزارم به شرطی کار میکنه که مثلاً بتونم 2 بار از fgetc استفاده کنم!
بعد مشکلی که پیش میاد وقتی که میخوام پرینت کنم دیگه مقداره N من مساوی نیست با اون عدد
Random که بدست آوردم !
این تیکه از سورس رو میزرم اینجا اگر لطف کنید و نیگه کنید :-(
بازم متشکرم!

----------------------------------------------------------------------------------------------
while (buf2 != EOF)
{
buf2 = fgetc(file_ptr);

if(buf2 == '\n')
{
y++;
if(y == random)
{
printf(buf2);
}
if(y > ran)
{
buf2 = EOF;
}

}
----------------------------------------------------------------------------------

mzjahromi
دوشنبه 24 بهمن 1384, 07:53 صبح
آیا این کد دقیقا کدی هست که شما استفاده می کنید؟


01: while (buf2 != EOF)
02: {
03: buf2 = fgetc(file_ptr);

04: if(buf2 == '\n')
05: {
06: y++;
07: if(y == random)
08: {
09: printf(buf2);
10: }
11: if(y > ran)
12: {
13: buf2 = EOF;
14: }
15: }


{ که در خط 05 وجود داره کجا بسته شده؟
توجه کنید که این ‌{ قبل از خط 7 باید بسته بشه و اینطور که از کد شما دیده میشه احتمالا بعد از خط 15 بسته میشه(یا تو خط 15) و همین برای شما مشکل ساز شده
در مورد مشکلاتی که مطرح کردید هم من دقیقا نمیدونم مشکل شما چیه و تو چه حالتی این مشکل براتون پیش میاد

mzjahromi
دوشنبه 24 بهمن 1384, 16:44 عصر
مثلاً عدد راندم شما 10 هست و تو فایل شما 6 رشته وجود داره!!
میتونی بنویسی
n Mod 6

saeedIRHA
دوشنبه 24 بهمن 1384, 18:51 عصر
سلام دوستان واقعاً ممنون از کمکتون !
اما من مشکلم رو با 2 تابع FSEEK و FTELL حل کردم
بازم مرسی

mzjahromi
سه شنبه 25 بهمن 1384, 15:41 عصر
از کجا میدونی تو فایلت 6 تا رشته هست.
باید بخونی تا آخر ببینی چند تا بود.
بعد که دیدی 6 تا رشته بیشتر نداشتی دوباره از اول بخونی تا به 10 برسی.
اگر حجم فایل کم باشه اون روشی که شما میگید درسته ولی تو حجم بالا این روش جوابگو نیست. ضمن اینکه برای کسی که مبتدی هست این روش یکم سخته.ضمن اینکه این یکی از روشها هست. روشهای زیادی هشتند که میشه این رو کنترل کرد. درهر حال ارزش یه برنامه ساده اینطوری اونقدرها نیست که بیشتر از این روش بحث بشه. چون تو بدترین حالت از Performance ظرف چند میکرو ثانیه عملیات رو انجام میده(یا حتی زودتر) حتی اگه صد بار هم فایل رو از اول تا آخر بخونه.ولی درسته اگر امکانش باشه که اول فایل رو بیاری تو حافظه و عملیات رو تو حافظه انجام بدی روش بهتریه.از حق نمیشه گذشت

saeedIRHA
چهارشنبه 26 بهمن 1384, 06:25 صبح
سلام دوستان!
روشی که من استفاده کردم به صورت زیر هست که کدش رو گذاشتم.
و تو این روش اصلاً طول string ها مطرح نیست!




while((buf2 = fgetc(file_ptr)) != EOF)
{
if(buf2 == '\n')
{y++;}
if(y == ran)
{
tell = ftell(file_ptr); //pida kardan Pointer String morede nazar dar file
break;
}

}

printf("Tell is :%d\n",tell);

fseek(file_ptr,tell,SEEK_SET); //Set kardan Pointer File
while((buf3 = fgetc(file_ptr)) != '\n')
{
i++;
if(buf3 ==EOF || buf3 =='\n')
{
break;
}
buf4[i]=buf3;
}
printf("%s\n",buf4);
printf("Length is : %d\n",strlen(buf4));


[CODE/]

saeedIRHA
پنج شنبه 27 بهمن 1384, 08:19 صبح
سلام دوست عزیز!
مرسی،اما من buf4 رو اول مقدار ش رو تین کردم به خاطره همین به Terminator "0" احتیاج نیست،
و هم کاره شمارم کردم و i رو با 1- مقدار دهی کردم!
بازم تشکر.