PDA

View Full Version : کمک در کار با فایلها



rasool1110
شنبه 09 آبان 1388, 21:55 عصر
با سلام
دوستان من میخام برنامه ای بنویسم که به صورت زیر هست اما من زیاد با فایل در سی ++ آشنایی ندارم و به سی ++ هم مسلط نیستم .
ما فایلی داریم که حاوی دستورات اسمبلی مثلا به فرم زیر است :

mov ax 0
mov bx 4
add bx ax

در این فایل دستورات ما شامل انتساب mov جمع add تفریق sub و چاپ wri می باشد . بین دستورات و آرگومانها یک فاصله برای جدا کردن وجود داره و نتیجه برنامه چاپ مقدار نهایی حاصل از عملیتهای مختلف برنامه است.
حالا میخاستم بدونم که اگه ممکنه به صورت یک شبه کد و راهنمایی به من کمک کنید که این برنامه رو بنویسم.
میدنم باید از توابع getline , split استفاده کنم اما کار کردن بااونها رو بلد نیستم . لطفا منو راهنمایی کنید
متشکرم

tdkhakpur
شنبه 09 آبان 1388, 22:03 عصر
متوجه منظورتان نشديم يعني ميخواهيد مفسر بنويسيد.
يه بار ديگه ميشه بگيد نتيجه كار چه چيز بايد باشد.

rasool1110
شنبه 09 آبان 1388, 22:12 عصر
سلام دوست من
بله برنامه یک مفسره کعه دستورات شبه اسمبلی موجود در فایل رو میخونه و با استفاده از مقادیری که در چهار ثبات تعریف شده ax,bx,cx,dx که بصورت آرگومان در توابع mov,add,sub,wriبکار رفتهاند یک نتیجه نهایی رو تولید می کنند که برنامه ما باید اون جواب رو نشون بده.
اگه میتونید من رو راهنمایی کنید :
1.چطور فایل رو باز کنم و اطلعاتش رو که شامل دستور،یک ثبات،و آرگومان دوم که یا ثبات یا یک عدد صحیح هست رو بخونم و اون رو تشخیص بدم.
مشکل من بیشتر همین خواندن و تشخیص دستور و آرگومانهاس.

rasool1110
یک شنبه 10 آبان 1388, 19:45 عصر
آخه یه بچه مسلمون نیس به من کمک کنه؟

tdkhakpur
یک شنبه 10 آبان 1388, 20:00 عصر
ببينيد اين برنامه خيلي پيچيده تر از اونه كه شما بتوانيد يك شبه حلش كنيد.
بهترين راه اينه كل كل فايل را داخل حافظه لود كنيد و پردازش را روي داده ها داخل حافظه انجام بديد.


long Handle, size;
int bytes=0, c=0;
char *mem;
Handle = (long)sopen( filename , O_BINARY | O_RDWR, SH_DENYNO, S_IREAD|S_IWRITE ) ;
GetFileSize(Handle, &size)
mem = new char[size];
while(c<size)
{
bytes = read( handle, &mem[c], 512 );
if( bytes>0 ) c+= bytes;
}
close( Handle);

دستي كد قرار داده شد اشكالات صوري را خودتان حل كنيد.
ولي در مورد اينكه چطور تشخيص بديد كه چه دستوري قرار دارد و شما چه عملياتي بايد انجام بديد بايد عرض كنم كه شما كلمات كليدي را داخل يك آرايه و نوع عمليات را در يك ارايه ديگر قرار دهيد به محض دريافت كلمه كليدي مشخص مثل mov منتظر دو عمل باشيد كه دومي را داخل اولي قرار دهد.
و ساير عمليات كه به اين شكل طراحي ميشوند كلا كار چندان سختي نيست فقط وقت مي بره.
موفق باشيد

rasool1110
یک شنبه 10 آبان 1388, 20:08 عصر
دوست من ممنونم
اما من فقط میخام بدونم چطور میتونم خطوط برنامه رو بخونم و اونا رو به سه قسمت تقسیم کنم : قسمت اول که دستور اون خطهو قسمت دوم که یکی از ثباتهاس و قسمت سوم که یا ثباته یا عدد صحیح.
میدونم باید برا خوندن خطوط از getline استفاده کنم و برای تشخیص تکه های هر خط از تابع split اما نحوه کار با اونها رو بلد نیستم
اگه میشه منو راهنمایی کنید.

ali zi zeperto
یک شنبه 10 آبان 1388, 20:50 عصر
روشی که دوستمون گفتن بهترین راهشه.کل فایلت رو باید ببری توی حافظه و بعد از الگوهای تطبیق رشته استفاده کنی تا ببینی که چه دستوراتی تو فایلت هست و بر اساس اون کار لازم رو انجام بدی.به قول همون دوستمون کار ساده ای نیست که بشه زود انجامش داد.

tdkhakpur
یک شنبه 10 آبان 1388, 20:51 عصر
اما من فقط میخام بدونم چطور میتونم خطوط برنامه رو بخونم و اونا رو به سه قسمت تقسیم کنم : قسمت اول که دستور اون خطهو قسمت دوم که یکی از ثباتهاس و قسمت سوم که یا ثباته یا عدد صحیح.

چرا دوست داريد همش با فايل كار كنيد حافظه كه راحتتره؟
ببينيد اصلا بحث خواندن خطوط نيست براي تحليل يك مفسر شما احتياج داريد كلمان را بررسي كنيد همانطور كه شما هم اطلاع داريد مابين دو جاي خالي يك كلمه قرار دارد .
خوب به فرض شما اولين كلمه را پيدا كرديد حالا وقت خواندن كلمات بعديست يعني اگر اولين كلمه شما add باشد شما بايد دو كلمه ديگر را هم بخوانيد كه همان دستورات شما را تكميل ميكند و به همين ترتيب براي ساير كلمات به همين شكل عمل ميشود .

rasool1110
یک شنبه 10 آبان 1388, 21:46 عصر
دوستان من فکر میکنم درست منظورمو بیان نکردم . صورت سوال من در این دوتا عکس ضمیمه هستش.این پروژه درسی منه.

mortezamsp
یک شنبه 10 آبان 1388, 21:53 عصر
char str[200], *word;
cin.getline(str);

word=strtok(str," ");//کلمه اول رفته تو word

while(word!=NULL)
{
word=strtok(NULL," ");
//هربار کلمه جدید ریخته میشه در word
}