الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح كود الاستنساخ

بدأه مصطفى 36a2 في 1 يونيو 2012 · 6 رد · 1,157 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

منذ فترة كتبت برنامج يقوم ياستنساخ الملفات الصغيرة وفق الخوارزمية التالية

يقرأ الملف المطلوب استنساخه .. ويخزن قيم الآسكي للمحارف التي تكون الملف ويحتفظ بها داخل ملف جديد هو عبارة عن كود جاهز للترجمة

وعند ترجمة الكود الناتج عن البرنامج سينتج لنا مولد للملف النسخة عندما نشغله سينشئ الملف النسخة المتوحشة :blink:

أود أن أنوه إلى أنني أضع الكود بين يديكم مع الشرح ... حيث أنه لا يكون الكود مصدراً مفتوحا بلا شرح

وأرجو بهذاالشرح فضل الله اولاً ... ثم أعتذر من الأستاذ محمد علاء الدين والأخ حسام حيث ناقشتهم بطريقة غبية في مشاركتي السابقة ... مشاركة مستنسخة

أترككم مع الكود والشرح والسلام عليكم

#include<fstream.h>//تضمين مكتبة التعامل مع الملفات
#include<iostream.h>//مكتبة الدخل والخرج
#include<windows.h>//مكتبة التعامل مع الويندوز...
#include<string.h>//مكتبة التعامل مع السلاسل المحرفية
void main()//الدالة الرئيسية
{
	cout<<"Enter The Source File Name(With its Form) : ";//طلب من المستخدم إدخال اسم الملف المراد استنساخه
	char Source[30];//الحجم الأعظمي للاسم 30 حرف ويمكن تغييره
	cin>>Source;//ادخال الاسم .. وطبعاً سيبقى هناك خانات غير مستعملة في المصفوفة
	char* Src=new char [strlen(Source)];//انشاء مصفوفة جديدة بحجم الاسم تماماً منعاً لأي خطأ لا حقا
	strcpy(Src,Source);//نسخ الاسم إلى المصفوفة الجديدة
	ifstream in(Src,ios::binary);//إنشاء كائن الإدخال من الملف
	for(int Size=0;!in.eof();Size++)//من أجل كل محتويات الملف
		in.get();//نأخذ حرفاً 
	//الحلقة السابقة تقوم بعد أحرف الملف .... طريقة مبتكرة أليس كذلك 
	in.close();//إغلاق الملف لأن الرجوع إلى البداية بعد بلوغ نهاية الملف لم يعمل وأجهل السبب
	cout<<"Please Enter The Result File Name : ";//الطلب من المستخدم أن يدخل اسم الملف الذي يريده ان ينتج عن عملية الاستنساخ
	char Result_name[30];//مصفوفة الاسم
	cin>>Result_name;//ادخال
	//والآن ستبدأ الخوارزمية 
	ofstream out("Clone_Generator.cpp",ios::binary);//نفتح ملف للكتابة وهذا الملف عندما يترجم سيعطينا ملف تنفيذي عندما نشغله سيعطي المستنسخ
	out	<<"#include<fstream.h>\nvoid main()\n{\n"//هذا الكلام هنا سيكتب في الكود داخل الملف الذي أنشأناه للتو
		<<"ofstream out(\""<<Result_name<<"\",ios::binary);\n"//لاحظ أخي كيف أننا الآن نكتب كود سيقوم بكتابة كود... ما رأيك
		<<"const int Size ="<<Size<<";\n"
		<<"short CL[Size]={";//فتحنا المصفوفة لنخزن القيم الآن 
	in.open(Src,ios::binary);//نفتح الملف الهدف 
	in.seekg(0);//نذهب للبداية
	out<<(in.get());//سنخزن رقم الآسكي للحرف الأول في المصفوفة التي فتحنا قوسها قبل قليل
	int buffer;//متحول مساعد
	for(int i=1;!in.eof();i++)//والآن وحتى نهاية الملف
	{
		buffer=in.get();//نأخذ الحرف ونضعه في المخزن المساعد
		if(buffer==-1)break;//إذا كان -1 فهو نهاية
		else out<<','<<buffer;//سنضع فاصلة بعد كل عنصر
		if(i%100==0)out<<endl;//كل 100 عنصر سننزل سطر حتى لا نضع كل المصفوفة في سطر واحد
	}
	out<<"};\nfor(int i=0;i<Size;i++)\nout<<char(CL);";//بعد انتهاء اسناد عناصر المصفوفة سنقوم بعمل حلقة كي تكتب حروف البرنامج أي أن هذه هي الحلقة التي ستنشئ الكائن المستنسخ
	out<<'}';//نهاية البرنامج الضمني
	out.close();//نهاية الكتابة
	//انتهى البرنامج
} 
void By_Mostafa_36a2(){
/*	ما كان من خير فمن الله جل جلاله 
وما كنا من تقصير فمني ... أستغفر الله العظيم
أخي القارئ... إذا كان هذا الشرح قد أفادك فلا تحرمني دعوة في ظهر الغيب جزاك الله خيراً 
وأرجو أن نتعاون لسد أي خلل 
والسلام عليكم*/
};

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 1 يونيو 2012 في 16:38

3
#2

السلام عليكم ....

+1

جزاك الله خيرا أخي مصطفى 36a2

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

+1

وعندي سؤال :

جربت على ملف صغير ونجحت العملية ,

ولكن لما أقوم بتجريب العملية على ملف متوسط الحجم تفشل عملية إعادته إلى صورته الأولى مرة أخرى ,

علمًا أنه قد أصبحت قيمة المتغير (Size= 1151342) يعني الملف كان أكثر من مليون بايت , وقد فهمت من الكود أن هذا الرقم هو طول المصفوفة "CL", فهل الخطأ الذي يحصل بسبب أن المصفوفات لاتستوعب هذا الطول ؟ وماهو الحل ؟ أنا بحاجة هذا الكود وبقوة .... شكرًا على الابداع .

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 4 يوليو 2012 في 15:52

#4

أشكرك جزيلاً أخي على قراءتك للكود ..أنا سعيد بالفعلsmile.gif

ما رأيك بطريقة الشرح هل كان فهم الكود سهلاً بوجودها ..؟

أتوق لمعرفة الإجابة .... smile.gif

في الواقع لم أكن أنوي تطوير الكود أكثر من ذلك ..sleep.gif

أما بالنسبة لسؤالك .. نعم المصفوفات تتسع لحد معين (تابع لحجم الstack المحجوزة )

لا أظن أن الحجم يتعلق بالرامات ... mellow.gif

فمثلا أنا لدي رامات 2غيغا ولا يسمح لي إلا بحجز مليون بايت (ربما أكثر قليلاً 0xFFFFF) ..

(لا أعرف إن كانت المشكلة من المترجم أم من شيء آخر اسأل الأستاذ C++er أو الأستاذ أحمد الشنقيطي فهما أعلم مني في ذلك .. )

على أي حال البرنامج يعمل بشكل جيد لأي ملف أصغر من 50 كيلو بايت ...blush.gif

ولكن لا تنس الوقت الكبير الذي يأخذه المترجم لتحويله إلى exe.. على أي حال الكود مفتوح لمت يريد تطويره ..

والله ولي التوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 5 يوليو 2012 في 01:21

#5
مصطفى 36a2 كتب:

أتوق لمعرفة الإجابة ....

ماشاء الله شرح بتفصيل جميل جدًا جدًا جدًا , الحقيقة لاأستطيع أن أفي موضوعك حقه ,

وياليت تسعفنا بحل المشكلة المذكورة إذا كنت حصَّلت الحل .

وعلى فكرة أنا وجدت أنك تعطي المصفوفة CL طول أكثر من بايتات الملف المُحول بواحد إن ماكنت مخطئ , لأني حولت ملف يمكن 3 بايت فعملها البرنامج 4 ,

تم تعديل هذه المشاركة بواسطة هدف الشمالي في 12 يوليو 2012 في 15:08

#6

الشرح مفهوم و جيد واشتغل عادي اما بالنسبة للملفات ذات الحجم الكبير

يمكن ان تقسم الملف لعدة مقاطع (مثلا كل مقطع 40 كيلوبابت) فنقوم بجلب المقطع الاول

من الملف المراد إستنساخه الى المصفوفة ثم من المصفوفة الى الملف المستنسخ

وتكرر نفس العملية بالنسبة للمقطع التالي حتى ننتهي من الملف باكمله وهذا

يضمن عمله مهما كبر حجم الملف المراد إستنساخه :wink:

اما بالنسبة لسبب مشكلة حجز المساحات في الرام فاظن انه يعود لبداية البرنامج

حيث يحوي كم سوف يتم حجز لهذا البرنامج في المكدس وهذا يحدده المترجم

عند ترجمة برنامج ما

راجع هذا الموضوع "تعلم كيف تعمل مترجمات لغات البرمجة"

تم تعديل هذه المشاركة بواسطة nadir02 في 12 يوليو 2012 في 18:17

#7

شكراً أخي هدف أسعدتني كثيراً ...

اقتباس
أنا وجدت أنك تعطي المصفوفة CL طول أكثر من بايتات

نعم أذكر أنني تركت البايت الأخير لEOF end of file نهاية الملف ... هذا ما أتذكره ... happy.gif

أخي نادر أشكرك على ردك وقراءتك للشرح شكراً جزيلاً :

اقتباس
تقسم الملف لعدة مقاطع

هذه هي الفكرة الوحيدة التي خطرت على بالي ... ولكنني حالياً مشغول بأمور أخرى ..

ولك كامل الحرية في أي تعديل تريده ... ولن أحتفظ بأي شيء... smile.gifsmile.gif

والله ولي التوفيق...

مواضيع مشابهة