PDA

View Full Version : فایل در c++



amir_narmafzar
یک شنبه 21 تیر 1383, 20:13 عصر
من یه فایل متنی دارم می خواهم کلماتش را به صورت جدا جدا خارج کدم

سیدهانی
دوشنبه 22 تیر 1383, 21:20 عصر
به نام حق
سلام
ببین باید از اول فایل رو باز کنی و بگی تا به کاراکتر space نرسیده هر رشته رو داخل یک ارایه دو بعدی بریزه ...
اگه تو این چیزایی که گفتم مشکل داری بگو ...
الان کامل تو ذهنم هست که چجوری میشه این برنامه رو نوشت ولی نمیدونم خیلی کلی سوال پرسیدی :متفکر:

آتوسا
شنبه 27 تیر 1383, 22:38 عصر
ببخشید من هم تقریبا همچین مشکلی دارم. میشه بیشتر توضیح بدین . در ضمن چرا آرایه دو بعدی ؟

سیدهانی
شنبه 27 تیر 1383, 23:33 عصر
به نام حق
سلام
خوب ببین، ما دو تا مشخصه لازم داریم، یکی تعداد کلمات موجود در متن و دیگری تعداد کاراکترهای هر کلمه ... و برای استفاده بهتر باید به صورت دینامیک، برای این آرایه تخصیص حافظ بکنیم...
پس قدم اول، شمردن تعداد کلمات هست که با یک حلقه میشه پیداش کرد (بگیم هروقت به space رسیدی یکی اضافه کن و ادامه بده تا به انتهای فایل برسی)
برای تعداد کاراکترهای هر کلمه هم 2 راه هست ... که دومیش ساده تر هست، اولی این هست که با رسیدن به هرکلمه، اول تعداد حروفش رو بشمره و بعد به همون تعداد براش تخصیص حافظ بدیم، راه دوم که ساده تر هست، ماکزیمیم تعداد کاراکترهای هر کلمه رو مشخص کنیم...
اگه درمورد تخصیص حافظه هم سوالی داری بگو ... البته اینها نظر من بود، دوستان دیگه اگه راه بهتری به نظرشون میرسه ممنون میشم بگن

آتوسا
یک شنبه 28 تیر 1383, 09:35 صبح
در مورد تخصیص حافظه می دونم که به دو صورت استاتیک و داینامیک هست. فقط اگه میشه کمی بیشتر در مورد داینامیک توضیح بدین. در ضمن من یه مشکلی هست . اینکه ممکنه کاربر به جای یه space دو تا space یا بیشتر بین کلمات بزنه. در برنامه ام باید کاری کنم که این فاصله های اضافی رو تشخیص بده و اونها رو از بین ببره. این به چه صورتی ممکنه؟

whitehat
یک شنبه 28 تیر 1383, 10:53 صبح
با سلام
به نظر من راه ساده تری هم هست .و آن استفاده از توابع داخل string.h می باشد که برای شمردن کاراکتر یک کلمه و جدا کردن آن تابع دارد . می توانید یک خط را بطور کامل خواند و کلمه ها را جدا کنید .توجه داشته باشید اگر فایل شما متنی است باید کاراکتر پایان خط را هم در نظر بگیرید. ولی در کل راه دینامیکی بسیار راحتر است.
تخصیص حافظه به صورت داینامیک هم به صورت یک لیست پیوندی یا link list امکان پذیر است . و هر کدام از نودها می توانند یک کلمه باشند یعنی یک لیست پیوندی دو بعدی که لیست اول شامل اشاره گر هایی به هر کلمه است .که علاوه بر آن هر نود تعداد کاراکتر های هر کلمه را در خود دارد.
در مورد دو فضا خب این که بسیار راحت هست با استفاده از یک حلقه while و یک if این کار براحتی انجام می شود شما باید همان لیست را که گفتم درست کنید با رسیدن به هر کاراکتر انرا در یک لیست بگذارید و اشاره گر اول آنرا در جایی داشته باشید. با رسیدن به هر فضای خالی اشاره گر اول لیست فعلی را را به لیست اصلی نسبت دهید (در اینجا باید چک کنید که لیست خالی نباشد چون ممکنه که فضای خالی تکراری باشد) .با رسیدن به کاراکتر پایان خط هم به خط بعدی بروید.(تعداد را در ساختن لیست کلمه ها فراموش نکنید)
موفق باشید

سیدهانی
یک شنبه 28 تیر 1383, 17:49 عصر
به نام حق
سلام ... با لیست پیوندی شاید برای دوستمون سخت بشه کار! با توجه به اینکه تعداد کلمات رو میشه پیدا کرد فکر نکنم نیاز چندانی به استفاده از لیست پیوندی باشه...
اما درمورد توابع String.h حق با شماست ... دوستمون میتونه از اونها استفاده کنه.

برای تخصیص حافظ دینامیک کافی هست که شما ابتدا تعداد کلمات رو پیدا کنید، درمورد اون فاصله ها شما باید با یه حلقه شروع کنید بگید اگه به اولین فاصله رسید اونقدر جلو بره تا به اولین کاراکتر غیر از فاصله برسه ...
اگه فایل متنی باشه هم میشه باینری بازش کرد تا به مشکل کاراکتر پایانی هر خط نرسیم...
با پیدا کردن تعداد کلمات، شما میتونید آرایه ای رو اینطور تعریف کنید :
<span dir=ltr>char **a</span>و حالا به صورت دینامیک بهش حافظه تخصیص بدید ... به این صورت که
<span dir=ltr>a=new char *[words_numbers] </span>
و بعدش با یه حلقه for به این صورت برای تک تک کلمات تعداد کاراکترها رو مشخص می کنیم :
<span dir=ltr>for(int i=0;i&lt;words_numbers;i++) a[i]=new char [charaters_numbers]</span>یعنی هرکلمه رو ابتدا بشمر تعداد کاراکترها رو بعد new کن و بعد منتقلش کن ... اما اگه تعداد کاراکترها رو ماکزیمم یه مقداری بگیری که راحت تر هست دیگه همون اول تو همین حلقه for بالا عدد رو می ذاری ... دیگه لازم به شمارش تعداد کاراکترهای هر کلمه نداری ...
موفق باشی

amir_narmafzar
یک شنبه 28 تیر 1383, 18:49 عصر
من یه مشکل دیگه هم دارم!
این که تو ارایه دو بعدی که گفته بودید توی هر خط به طور خودکار
یک سری شکلها رو به طور خودکار به اخر هر خط اضافه میکنه مثل ؟و.٪×،مثلث و......
لطفا منو راهنمایی کنید.

سیدهانی
یک شنبه 28 تیر 1383, 19:20 عصر
به نام حق
سلام .... منظورت از آخر هر خط چیه ؟! ببین تو بعد از وارد کردن هر کلمه، وقتی تمام کاراکترهاش رو وارد کردی باید ببیندش یعنی کاراکتر NULL رو به انتهاش اضافه کنی : <span dir=ltr>a[i][j]='\0';</span>
یا <span dir=ltr>a[i][j]=0;</span>
که i شماره کلمه و j شماره آخرین کاراکتر به علاوه یک هست...

amir_narmafzar
دوشنبه 29 تیر 1383, 16:37 عصر
ببین توی اخر هر خط ارایه دو بعدی وقت چاپ هر ارایه افقی با اینکه از 0\ استفاده میکنم این شکل ها رو اضافه می کنه!!!!!!

سیدهانی
دوشنبه 29 تیر 1383, 20:23 عصر
به نام حق
سلام ... شاید درست از فایل به داخل آرایه نمیریزی ... بیشتر دقت کن حتما مشکل رو پیدا میکنی