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

مجموعة أسئلة عن دوال التعامل مع الملفات

مغلق
بدأه eias في 3 فبراير 2006 · 7 رد · 821 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الحقيقة قرأت أحد دروس الأخ JASS و كان الدرس رائع عن الدوال ..و بدأت فيه حرفا

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

هناك بعض المتطرفات أحد أن أعلم عنها :

الكود الأول

HANDLE hFile;
DWORD nbyte;
hFile=CreateFile 

("D:\\file.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_

READ|FILE_SHARE_WRITE
  ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hFile!=INVALID_HANDLE_VALUE)
WriteFile (hFile,(LPCVOID)"Arab-team",9,&nbyte,NULL);

CloseHandle (hFile);

كود لإنشاء ملف نص و أريد أن أسأل عن :

1- ما هو هذا المتغير DWORD ..يبد أنه متغير حرفي.

2- في البارامتر الثاني لماذا كتبنا (LPCVOID) قبل البيانات.

3- في البارمتر الثالث لماذا استخدما 9Bytes ولم نستخدم أكثر أو أقل.

و الآن هذا الكود :

HANDLE hFile;
DWORD nbyte;
char buff[10];

ZeroMemory(buff,10);   //تصفير مصفوفة حروف

hFile=CreateFile ("D:\\file.txt",GENERIC_READ,0
  ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(hFile==INVALID_HANDLE_VALUE)  //إذا كان المقبض خطأ
strcpy(buff,"Error");    //نفذ الكود وهو نقل كلمة خطأ لمصفوفة الحروف  
else    // وإذا كان غير ذلك نفذ دالة القرائة
ReadFile (hFile,buff,9,&nbyte,NULL);

MessageBox (NULL,buff,NULL,NULL);   // إظهار نتيجة القرائة

CloseHandle (hFile);

4- ZeroMemory ما هذه الدالة بالضبط .

5-لقد لاحظنا أن الأخ حمل للمصفوفة كلمة Error في حال حدث خطأ و لكن لو لم يحدث كيف

استطاعت الدالة أن تحمل النص الموجود في الملف إلى داخل المصفوفة ..لأن الأمر Strcpy

لم يستخدم إلا مرة واحدة ..

6- هل نستطيع تحميل النص من الملف مباشرة بدون مصفوفة ..لأننا لا نعرف ما هو النص

الموجود في الملف..و بدون استخدام مصفوفة مؤشرات ..

و سؤال على الماشي :lol: هل نستطيع استخدام هذه الدالة لإنشاء ملفات الصور أيضا.

و شكرا لكم.الأسئلة ليست كثيرة أليس كذلك :D ؟

#2

قبل أن أجيب عليك سأضع تساؤل:

قلت أن الامثلة عن التعامل مع الملفات

قبل تطبيقك للأمثلة هل قرأت عن دوال الـ API -المستخدمة في تلك الامثلة - في مكتبة MSDN ؟

الأمثلة التي وضعها الأخ JAAS كان يعني بها شرح طريقة استخدام الدوال بافتراض أن للقارئ معلومات مسبقة عنها ...

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

http://msdn.microsoft.com/library/default....t_functions.asp

مؤقتاً اقرأ عن الدوال المذكورة في الأمثلة فقط

بالنسبة للسؤال الأول

DWORD تعني Double WORD وأظنك تعلم ماهي الـ WORD ... اذا فهي ليست متغير حرفي ..

اقتباس
4- ZeroMemory ما هذه الدالة بالضبط .

http://msdn.microsoft.com/library/default..../zeromemory.asp

بعد قراءة ما ورد في الوصلة السابقة كاملاً أي تساؤل بامكانك وضعه ...

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

أو الحل الأسرع إنتظر واحد من الشباب يجيب لك عن التساؤلات بالتفصيل ...

تحياتي

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#3

بالنسبة لـ DWORD و LPCVOID فهي مجرد typedef قامت بها مايكروسوفت لأسباب خارجة عن علمي!! اظن من اجل توحيد "الأنواع" في اللغات المختلفة اللتي ستستخدم الـ Win32 api .. مثلا فجول بيسك ربما ليس فيها نوع اسمه int بل اسمه على ما اظن هو integer .. و الله أعلم .. و هذا مجرد تخمين.

بالنسبة لبقية الأسئلة, فلا بد ان تعلم وظيفة الدالة و طريقة استخدامها, فإذا عرفت ذلك ستفهم التفاصيل اللتي سألت عنها.

عندك مثلا, WriteFile (إضغط على الوصلة) تعطيها عنوان لسلسلة بايتات (او buffer كما يصطلح عليه) في الذاكرة و تحدد لها حجم هذه السلسلة ..

لعلك تتسائل لماذا نحتاج لتحديد حجم السلسلة؟

حسنا, الاجابة هي ان عنوان السلسلة هو فقط عنوان بدايتها, و لكن من اجل معرفة السلسلة بالكامل نحتاج الى البداية و النهاية .. او البداية و الحجم (و النهاية ستكون البداية + الحجم)

عندما تمرر "Arab-Team" للدالة, فأنت فقط تمرر العنوان اللذي تبدأ منه هذه الجملة (لفهم هذه النقطة, تحتاج الى خلفية عن الـ c-style string او بمعنى آخر, تحتاج خلفية كافية لفهم التعامل مع الـ string في لغة السي), و كما تشاهد فالجملة مكونة من تسعة أحرف, و بما ان كل حرف يشغل بايت واحد, فحجم هذه السلسلة هو 9 بايتات.

بالنسبة لـ ZeroMemory فوظيفتها هي وضع اصفار في مكان معين في الذاكرة .. و إذا كنت تتسائل لماذا نحتاج لذلك؟ فالاجابة هي ان الذاكرة ممكن يكون فيها اي نوع من الخرابيط العشوائية, قيم غير معروفة. و إذا بقيت هذه القيم غير معروفة فسيسبب هذا خللا في البرنامج, لذلك نضع اصفار في منطقة معينة من اجل التغلب على هذه المشكلة. بعض اللغات الأخرى مثل جافا و سي شارب تقوم بهذه العملية تلقائيا عند حجز متغير جديد, و لكن السي لا تقوم بذلك.

في المقطع الثاني من الكود, نقوم بقرائة جزء من ملف و نضع النتيجة في مصفوفة اسمها buff من اجل عرض ما قرأناه على الشاشة. فإذا قرأنا مثلا "Arab-Team" فسنقوم بعرض هذه الجملة في مربع حوار ..

و لكن ماذا لو كان هناك خطأ أثناء قرائة الملف؟

عندها فإننا نريد ان نعرض رسالة خطأ ..

هنا اختار كاتب الكود ان يعرض الخطأ عن طريق وضع كلمة "Error" في المصفوفة buff

طبعا يمكن القيام بذلك بطريقة أخرى .. مثل

if(hFile==INVALID_HANDLE_VALUE)  //إذا كان المقبض خطأ
{
    MessageBox (NULL,"Error",NULL,NULL);
}
else    // وإذا كان غير ذلك نفذ دالة القرائة
{
    ReadFile (hFile,buff,9,&nbyte,NULL);
    MessageBox (NULL,buff,NULL,NULL);   // إظهار نتيجة القرائة
}

و الكود هنا يؤدي نفس الغرض بالضبط ..

السؤال رقم 6 لم أفهمه ..

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

/index.php?showtopic=81657

http://204.157.36.16/index.php?showtopic=81657

بالمناسبة, اعتقد ان الأسئلة اللتي سألتها تعني ان هناك اشياء أساسية في لغة السي حضرتك غير مدرك لها, فنصيحتي الشخصية لك هي العودة خطوة الى الوراء لمراجعة معلوماتك و التمرس أكثر :)

#4

hasan_aljudy

أنت كده إصطدت السمكة وشويتها وقدمتها على طبق من ذهب ... :D

ما علينا ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#5

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

أخي الكريم cipherشكرا لك. يا رجل ما كل هذه الروابط أنا عندي MSDN الخاص ب .Net أعتقد أن اللغتين لهما نف التعليمات ..

بالنسبة للDWORD فهمت عليك و هذا يعني أنه يمكن استخدام CString أيضا.

أخي الكريم Hasan شكرا على توضيح سلسلة الBytes وZeroMemory يبدو أن تركي للConsol من منتصفه سبب ذلك..

فعلا الكود الذي كتبته أفضل على الأقل من أجل توضيح فكرة معينة و ليس مجمموعة أفكار كما في سابقه.

بالنسبة للسؤال السادس كان قصدي نفس المشكلة التي يقع بها متعلموا الConsol و هي كيف ستحمل نص ليس معروف عدد أحرفه في مصفوفة محددة الأحرف ..طبعا أنا كان قصدي أني أريد Buffer يحمل النص مباشرة مهما كان حجمه بدون مصفوفة و لا شيء ..هل ممكن ذلك..

معك حق هناك أشياء أساسية و غير أساسية أيضا غير مدرك لها :lol: هو هذه الفترة هي مجرد تمضية لمدة أسبوع و لكن لنا في الصيف عودة ...و لكن المشكلة أنني كلما قرأت عن الConsol أشعر بأن لا فائدة منه أعود للMFC لا أستطيع تحليل أكوادها..

#6

أخي الكريم cipher هو يعني اصطادها فقط بس أنا الي شويتها ..:lol: بس الحقيقة استفدت كثيرا من السمكة لأني و باعتباري لست طالب معلوماتية سأحاول البحث عن سبب الحل أكثر من الحل :lol:

#7

لا تفكر كونسول او غير كونسول .. السي ليست مثل الفجول بيسك.

السي تحتاج فترة تعلم طويلة قبل البدء في برامج واجهة مرئية .. و ليست مثل الفجول بيسك ..

الهدف من السي هو انشاء برامج النظام و ليس مهما فيما اذا كان لها واجهة مرئية ام لا .. في الحقيقة هناك الكثير من البرامج اللتي تقوم بعمل الكثير من الأشياء المعقدة دون واجهة ..

لا يوجد علاقة بين البرمجة و الواجهة .. هدف البرمجة ليس تصميم الواجهات!!

عد الى البداية كما قلت, و ركز على الأساسيات .. السي تحتاج معرفة و تعلم لبعض الأشياء الدقيقة عن بنية الحاسوب (مثل الذاكرة .. الخ)

#8

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

شكرا

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…