C البرمجة التعامل مع الملفات باستخدام فتح ()، قراءة ()، كتابة () وإغلاق () الأمثلة السابقة للتعامل ملف التعامل مع كتل التحكم في الملفات (فب). ضمن أنظمة مسدوس v3.x (أو أكبر) و أونيكس، يتم التعامل مع الملفات في كثير من الأحيان باستخدام المقابض بدلا من كتل التحكم في الملف. برامج الكتابة باستخدام مقابض يضمن قابلية شفرة المصدر بين أنظمة التشغيل المختلفة. باستخدام مقابض يسمح للمبرمج لمعالجة الملف كتدفق من الأحرف. وسائط الوصول المتاحة هي أذونات هي الدالة () مفتوحة ترجع قيمة عدد صحيح، والذي يستخدم للإشارة إلى الملف. إذا لم ينجح، فإنه يعود -1، ويحدد المتغير العالمي إرنو للإشارة إلى نوع الخطأ. تحاول وظيفة القراءة () قراءة نبيتس من الملف المرتبط بالمقبض، وتضع الأحرف في المخزن المؤقت. إذا تم فتح الملف باستخدام أوتكست، فإنه يزيل إرجاع النقل ويكتشف نهاية الملف. ترجع الدالة عدد وحدات البايت التي تمت قراءتها. في نهاية الملف، يتم إرجاع 0، على خطأ إرجاع -1، تعيين إرنو للإشارة إلى نوع الخطأ الذي حدث. محاولة الكتابة () كتابة نبيتس من المخزن المؤقت إلى الملف المقترن مع مقبض. على الملفات النصية، فإنه يوسع كل لف إلى كرلف. ترجع الدالة عدد وحدات البايت المكتوبة إلى الملف. قيمة عودة -1 تشير إلى خطأ، مع إرنو مجموعة بشكل مناسب. إغلاق الدالة () تغلق الملف المرتبط بالمقبض. ترجع الدالة 0 إذا كانت ناجحة، -1 للإشارة إلى خطأ، مع مجموعة إرنو بشكل مناسب. حقوق الطبع والنشر B البني. 1984-1999. جميع الحقوق محفوظة. الملفات الثنائية مع C R. A. فورد قسم الرياضيات. نب مقدمة استخدام تيارات لمعالجة الملفات من الممكن بالتأكيد في C، ولكن معظم الكتب المدرسية C لا تتضمن أي معلومات بشأن وظيفة كاملة من تيارات. وقد تم تشكيل هذه الوثيقة لمساعدة الطلاب مع خلفية في C وهياكل البيانات مع وصف كامل لمكتبة تيار C. وتستند الوثيقة على وثائق مكتبة غنو كبب التي في بعض الأحيان ليست سهلة القراءة، وخاصة من دون أمثلة. ومن المفترض أن مشغلي الإدراج والاستخراج (أي لتلت والمقصود أن تستخدم من قبل برامج للكتابة إلى والقراءة من الملفات النصية أن المبرمج هو على دراية الاختلافات بين هذين تنسيقات الملفات. في الواقع هناك عشرات من ملحقات مع القليل توثيق تيارات النص العادي سيتم إضافة قسم إضافي إلى هذا المستند في وقت لاحق أساسيات الملف إو يتطلب الوصول إلى ملف ثنائي من برنامج C (من خلال عدم استخدام الدالات C القديمة) أولا ربط متغير تيار بالملف (فريم فيل ستريم) و إفريمستريم (تيار ملف الإدخال) لا تزال أنواع من الجداول لاستخدامها، وهناك نوع إضافي يسمى فستريم يتم توفيره الذي يسمح للملفات التي يمكن كتابتها إلى وقراءة من إذا كان هذا (في تصميم برامج نوع قاعدة البيانات، وهذا هو الحال في كثير من الأحيان ).قبل أي عملية يمكن أن تجري على ملف، فإنه يجب بالطبع أن يتم فتح. عندما تنتهي مع الملف، فإنه ينبغي إغلاقها لتجنب فقدان البيانات. فتح تيار يحتوي كل من إفستريم و أوفستريم على وظائف الأعضاء المسماة أوبين والتي تستخدم لإرفاق الدفق باسم ملف فعلي وفتح الملف للقراءة أو الكتابة. توفر وظيفة العضو المفتوح أيضا بعض الوسيطات الاختيارية التي لا يتم وصفها في كثير من الأحيان. النموذج الأكثر عمومية لهذه الدالة هو التنسيق الذي استخدمه يشير إلى أن وسيطات الوضع والحماية اختيارية. الوسيطة الأولى هي دائما اسم الملف على القرص الذي سيتم إرفاق الدفق به. يتم تضمين معدل كونست بحيث مبرمج يمكن كتابة اسم الملف (داخل يقتبس مزدوجة) في استدعاء وظيفة. الجزء الصريح الوحيد حول استخدام الدالة عضو مفتوح تحت أنظمة دوس القائمة (بما في ذلك ويندوز) التي يتم فصل الدلائل من قبل استدعاء أن حرف مائل مائل لديه معنى خاص في سلاسل C. يتم استخدام المعلمة بروت لتحديد الحماية (إذن) من الملف تحت أنظمة التشغيل متعددة المستخدمين مثل أونيكس. انها تسمح لك لتحديد أي المستخدمين يسمح لهم أن ننظر إلى هذا الملف. ضمن دوسويندوز، لا يتم استخدام هذه المعلمة مطلقا. عادة ما يتم ترك المعلمة وضع عند التعامل مع الملفات النصية، ولكن هناك بعض الحالات المفيدة جدا تحت الملفات الثنائية التي يجب تعيين هذه المعلمة. هناك عدد من الخيارات التي يمكن أن تعطى لهذه المعلمة. إذا كنت بحاجة إلى تحديد أكثر من واحد منهم ببساطة وضع شريط عمودي بينهما. يوس :: إن يشير هذا إلى أن التيار سيستخدم للإدخال. قد يبدو هذا زائدة عن الحاجة ل إفريمستس التي يتم وضع علامة تلقائيا للإدخال عند فتحها، ولكن يجب أن تستخدم من حين لآخر. عند استدعاء مفتوحة مع عدم وجود معلمة الثانية، ويفترض المعلمة أن يوس :: في ولكن إذا كنت تعطي أي معلمة أخرى مثل يوس :: ثنائي سوف تحتاج إلى تحديد أن الملف هو ملف الإدخال كذلك. يوس :: أوت يشير هذا إلى أن التيار سيستخدم لإلخراج. مثل دائرة الرقابة الداخلية :: في هذا قد يبدو زائدة عن الحاجة ل أوبستريم s ولكن لنفس السبب كما هو موضح أعلاه، فإنه عادة ما تعطى. يوس :: يت هذا يؤدي مؤشر الملف إلى نقطة في نهاية الملف عند فتح الملف. يوس :: ترونك هذا يؤدي إلى تجاهل كافة البيانات الموجودة في الملف (محوها) عند فتح الملف. كن حذرا جدا عدم استخدام هذا الخيار على ملف كنت لا تريد دمر دائرة الرقابة الداخلية :: ثنائي هذا يسبب الوصول إلى الملف كملف ثنائي. على الأرجح سوف تحتاج إلى تعيين هذا الخيار. إذا كنت قد نسيت لتعيين هذا الخيار، سوف تحدث العديد من المشاكل الغريبة عند قراءة أحرف معينة مثل نهاية السطر ونهاية الملف. مثال لفتح ملف ثنائي: الكتابة إلى ملف ثنائي ذكرته مرة واحدة يتم استخدام لتل لكتابة البيانات إلى ملف نصي. إذا كان لديك متغير x الذي يحتوي على القيمة 354 وكنت تستخدم التصفية أوتيل لتلت x هذا من شأنه أن يسبب الحرف 3، الحرف 5، والحرف 4 ليتم كتابتها (في شكل أسي) إلى الملف. هذا ليس شكل ثنائي الذي يتطلب فقط 16 بت. توفر الطبقة من التيار وظيفة عضو اسمه الكتابة التي تسمح لكتابة المعلومات في شكل ثنائي إلى تيار. النموذج الأولي لوظيفة الكتابة هي هذه الدالة تؤدي إلى كتابة n بيتس من موقع الذاكرة التي يقدمها المخزن المؤقت إلى القرص وتحريك مؤشر الملف قبل n بايت. أنواع المعلمات تتطلب قليلا من التفسير. على الرغم من أن نوع العودة هو أوفستريمبريم عادة ما يتم تجاهل قيمة العودة من قبل معظم المبرمجين. مؤشر العازلة من نوع باطل هذا يسمح لأي نوع من المتغير لاستخدامها كمعلمة الأولى. يجب أن لا تكون كتابة وظائف مع المعلمات باطلة، وهذا هو جزء صعب جدا من البرمجة. نوع تيارات هو مجرد عدد صحيح موجب. ومن النادر أن تعرف بالضبط كم عدد وحدات البايت لمتغير معين. للحصول على هذه المعلومات، يوفر C ماكرو (مثل دالة) اسمه سيزوف الذي يأخذ معلمة واحدة بالضبط ويعيد حجم المعلمة من حيث البايتات المطلوبة للتخزين. وفيما يلي مثال على استخدام الماكرو الحجم للحصول على حجم متغير وكتابة محتويات متغير إلى القرص. لاحظ استخدام بنية بدلا من فئة يجب أن لا تستخدم هذه الطريقة لكتابة الفصول إلى الملفات الثنائية راجع القسم بعنوان كتابة فئات إلى ملفات للحصول على وصف لكيفية القيام بذلك. القراءة من ملف ثنائي قراءة البيانات من ملف ثنائي هو تماما مثل الكتابة إلا أن وظيفة تسمى الآن قراءة بدلا من الكتابة عند قراءة البيانات من ملف هناك بضعة أشياء جديدة لمشاهدة: هي مسؤولية مبرمج للتأكد من أن المخزن المؤقت كبيرة بما فيه الكفاية لعقد كافة البيانات التي يتم قراءتها. من المحتمل أن يؤدي مقطع التعليمات البرمجية التالي إلى حدوث تعطل ما لم يكن حجم عدد صحيح 7 بايت (عدد غير المرجح): إنت مين () إنت x إفستريم إنفيل infile. open (silly. dat، يوس :: بيناري يوس :: إن) إنفيل. read (أمبكس، 7) يقرأ 7 بايت في خلية إما 2 أو 4 بعد قراءة شيء من الملف، يجب استدعاء الدالة عضو الفشل () لتحديد ما إذا كانت العملية المكتملة بنجاح. في C، أي عمليات ملف يسبب البرنامج لوقف. إذا حدث خطأ وكنت لا تحقق من ذلك، ثم سيتم تشغيل البرنامج بشكل غير موثوق به. انظر قسم آخر في هذا المستند فيما يتعلق بكشف الأخطاء. مؤشر الملف كلما تم قراءة البيانات من أو ملف إلى ملف، يتم وضع البيانات أو مأخوذة من موقع داخل الملف الموصوف من قبل مؤشر الملف. في ملف وصول متتابعة، يتم قراءة المعلومات دائما من البداية إلى النهاية وفي كل مرة يتم قراءة أو كتابة بايت n، يتم نقل مؤشر الملف n بايت قبل. في ملف الوصول العشوائي، يسمح لنا بنقل مؤشر الملف إلى مواقع مختلفة لقراءة البيانات في مواقع مختلفة داخل ملف. فكر في قاعدة بيانات كاملة من عناصر المتجر. عندما يتم فحص هذا البند في الخروج، ويستخدم الباركود للبحث عن وصف وسعر البند. إذا كان الملف الوصول تسلسلي، سيكون لدينا لبدء البحث في بداية الملف الذي هو على الأرجح أبطأ مما نود. هذه ليست دورة في معالجة الملفات، ولكن يكفي أن نقول أنه إذا كنا يمكن أن تتحرك مؤشر الملف مباشرة إلى السجل الذي يحتوي على البيانات التي يجب أن تقرأ من الملف مرة واحدة فقط. تيلب () وظيفة عضو لديه نموذج من النموذج يقبل هذه الدالة لا معلمات، ولكن ترجع الموقع المحدد في وحدات البايت من بداية الملف حيث يجلس مؤشر الملف حاليا. القراءة القادمة أو الكتابة سوف تجري من هذا الموقع. سيكب () وظيفة عضو لديه نموذج من نموذج سيكب الفراغ (سترمبوس الموقع، إنت قريب) هذا يسبب مؤشر الملف للانتقال إلى موقع آخر داخل الملف. يحدد الموقع عدد وحدات البايت التي سيتم استخدامها لتحديد الموقع والمعلمة النسبية تشير إلى ما إذا كان هذا نوعا من طلب تحديد المواقع المطلق أو النسبي. القيم المحتملة للنسبي هي: يوس :: بيج يشير هذا إلى أن الموقع هو عدد وحدات البايت من بداية الملف. يوس :: كور يشير هذا إلى أن الموقع هو عدد وحدات البايت من موقع مؤشر الملف الحالي. هذا يسمح لتحديد المواقع النسبية من مؤشر الملف. يوس :: إند يشير هذا إلى أن الموقع هو عدد وحدات البايت من نهاية الملف. ونحن نعتبر مثالا يستخدم كل من الحصول على وتحديد موقع مؤشر الملف: إنت مين () إنت x ستريمبوس بوس إفستريم إنفيل infile. open (silly. dat، يوس :: بيناري يوس :: إن) infile. seekp (243، يوس: : بيغ) نقل 243 بايت في ملف infile. read (أمبكس، سيزوف (x)) بوس infile. tellg () كوت لتلت مؤشر الملف هو الآن في موقع ltlt pos ltlt endl infile. seekp (0، دائرة الرقابة الداخلية :: نهاية) (10، يوس :: كور) احتياطية 10 بايت infile. close () كتابة الفئات إلى الملفات الثنائية أسهل طريقة لتخزين السجلات في الملفات هي استخدام بنية إذا كنت تقوم بحفظ تتبع السجلات في هياكل الذاكرة باستخدام الطبقات، ثم حفظ هذه الفئات إلى القرص يأخذ القليل من العمل الإضافي. لا يمكنك ببساطة استخدام وظيفة عضو الكتابة وإعطاء عنوان الكائن كما المخزن المؤقت. والسبب في ذلك هو وجود وظائف الأعضاء. لن يكون من المنطقي حفظ وظائف الأعضاء هذه الوظائف العضو في نهاية المطاف الحصول على حفظها كمواقع الذاكرة التي من شأنها أن تتسبب في تعطل جهاز الكمبيوتر الخاص بك إذا قمت بتحميل أي وقت مضى من القرص مع موقع الذاكرة القديمة. من الممكن كتابة الكائنات إلى القرص ولكن يتطلب أن الكائن لها وظيفة عضو المرتبطة به. نهجي المعتاد هو إدراج وظيفة عضو اسمه القراءة والكتابة في كل وظيفة العضو. يجب أن تأخذ هذه الدالات فاستريم كمعلمة كما تيار لإنقاذ نفسه ل. يجب على البرنامج ثم فتح تيار واستدعاء وظيفة العضو مع تيار المناسب. يجب أن تذهب وظيفة العضو بعد ذلك من خلال كل حقل بيانات من الكائن كتابة بها في ترتيب معين. يجب أن تقوم وظيفة العضو قراءة المعلومات من القرص في نفس الترتيب بالضبط. المثال لهذا القسم هو القليل من المشاركة، لذلك إيف القضاء على وظائف الأعضاء غير الملف. تبدأ تشمل ltiostream. h تشمل ltstdlib. h تشمل ltfdstream. h تشمل ltfstream. h ما حدث خطأ في هذا القسم، وسوف أشير إلى اثنين من الأساليب لتحديد ما إذا كانت عملية ملف ناجحة وإذا لم يكن، وهناك بضع طرق لتحديد ما حدث خطأ تقريبا . بعد كل عملية القرص، برنامج مكتوب بشكل جيد سوف ندعو فشل عضو وظيفة () لمعرفة ما إذا كانت العملية أنجزت بنجاح. والأمر متروك لمبرمج لتحديد ما ينبغي أن يحدث عند عملية ملف يذهب سيئة. أساسا هناك ثلاثة احتمالات: تجاهل المشكلة ونأمل أن يحدث أبدا. هذا هو نهج بخير للتعامل مع الأخطاء بالنسبة للبرامج الصغيرة المكتوبة لاختبار فكرة، ولكن نسخة العمل بشكل كامل من برنامج لا ينبغي أبدا أن نفترض أن المستخدم لن تجعل من الخطأ. في حالة حدوث خطأ، استدعاء إنهاء (إكسيتافيليور) وإنهاء البرنامج. هذا هو سليلي أفضل من مجرد أمل أنه لا يحدث، ولكن في النسخة الكاملة من البرنامج، وهذا يمكن أن يكون إزعاجا حقيقيا للمستخدم. فكر في ما سيحدث إذا قضيت 5 ساعات في كتابة مقال، ثم حاولت حفظه إلى T: الذي لم يكن موجودا. إذا كان البرنامج الخاص بك مجرد إحباط ثم كنت قد فقدت 5 ساعات من العمل. عند حدوث خطأ، دع المستخدم يحاول تصحيح الخطأ ومحاولة العملية مرة أخرى. هذه هي الطريقة المفضلة بقدر ما يتعلق المستخدم، ولكن عادة لا تافهة إلى البرنامج. يجب أن تحاول تنفيذ هذا قدر الإمكان. تنشأ حالة مؤسفة عند التعامل مع الأخطاء، فهي عادة الأشياء المادية التي تجعلها تعتمد على نظام التشغيل. بعد ذلك، سوف أسرد نهج أنسي (القياسية) للتعامل مع الأخطاء ونهج دوس للتعامل مع الأخطاء. نهج أنسي هو أكثر عمومية، وبالتالي فإن رسائل الخطأ لن تكون دقيقة، ولكن النهج أنسي سوف تعمل بغض النظر عن مترجم C التي تستخدمها. معالجة الخطأ دوس يلغي بعض الارتباك حول ما حدث ولكن من الواضح أن جيدة فقط على آلات دوس التي تدعم المكتبة (توربو C، بورلاند C، و غنو G دعم هذه المكتبة). لجعل الأمور أبطأ قليلا، يبدو أن هناك أي دعم خطأ المضمنة في تيارات أخرى من وظيفة فشل (). لمكافحة الأخطاء علينا الاعتماد على بعض وظائف C القائمة التي لا توجد مشكلة لاستخدامها من C منذ C هو مجرد امتداد ل C. أنسي أخطاء أنسي C يدعم متغير عالمي (أوه لا، متغير عام) اسمه إرنو التي يمكن أن تكون الوصول إليها من خلال تضمين errno. h عند حدوث أخطاء يتم تعيين المتغير إلى رمز خطأ قياسي التي ينبغي أن تكون مكافئة على جميع أنظمة التشغيل. هناك عدد كبير جدا من رموز الأخطاء لإزعاج قائمة البيانات في هذا المستند. عادة أفضل طريقة لاكتشاف جميع رموز الخطأ هي أن ننظر إلى الصفحة اليدوية أو على الخط مساعدة في البحث عن الكلمة إرنو ملف تضمين يعرف مجموعة من الثوابت التي يمكن استخدامها لتحديد نوع الخطأ الذي حدث. على سبيل المثال، رمز الخطأ 22 يشير إلى أن الملف الذي حاولت للتو فتح غير موجود. وهناك طريقة أفضل قليلا ليقول 22 هو استخدام ثابت. هناك وظيفة في stdio. h اسمه بيرور الذي يأخذ سلسلة واحدة كمعلمة. عندما يتم استدعاء هذه الدالة، يتم عرض السلسلة على الشاشة متبوعة بنقطتين ثم بواسطة رسالة تصف القيمة في إرنو يمكن أن يكون هذا مفيد إذا كنت لا تريد كتابة معالجات الأخطاء وتريد فقط أن يتوقف البرنامج. وفيما يلي برنامج بسيط يقرأ اسم الملف من المستخدم، يفتح الملف ويعرض حقيقة أن محرك الأقراص لم يكن جاهزا، لم يكن الملف موجودا أو رسالة الخطأ القياسية. الرئيسية () إفستريم البيانات شار filename50 كوت لتل ملف لفتح cin. getline (اسم الملف، 50) data. open (اسم الملف) إذا (data. fail ()) التبديل (إرنو) حالة إيسس: يتم تعيين هذا إذا كان محرك الأقراص ليست جاهزة في دوس كوت لتلت محرك الأقراص غير جاهز أو إذن مرفوض لتل إندل برياك كيس إنونت: كوت لتلت تعذر العثور على هذا الملف لتلت إندل برياك ديفولت: بيرور (فتح ملف البيانات) إكسيت (إكسيتافيليور) برنامج حقيقي ثم حلقة مرة أخرى وطلب من المستخدم حاول ثانية. . دوس إكستندد إرورس إذا نظرتم إلى الأخطاء الواردة في قائمة أنسي ستلاحظون أن الكثير منهم غير موجه حقا نحو دوس بمعنى أنك لا تعرف على وجه اليقين إذا كان قطاع ما سيئا على قرص أو ترك باب المحرك مفتوحا. وذلك لأن معيار أنسي كان أكثر أو أقل معرفة على نظام أونيكس حيث لا ينظر إلى هذه الأنواع من الأخطاء أبدا من قبل المستخدمين. معظم المترجمين مقرها دوس توفر بضع وظائف ل أسيسينغ خطأ الموسعة دوس الذي يوفر أوسوالت وصف أكثر دقة من الخطأ. ملف معالجة البيانات في ملف C. وتسمى بيانات المعلومات المخزنة تحت اسم محدد على جهاز تخزين ملف. مجرى. ويشير إلى تسلسل من وحدات البايت. ملف نصي. وهو ملف يقوم بتخزين المعلومات في أحرف أسي. في ملفات نصية، يتم إنهاء كل سطر من النص بحرف خاص يعرف حرف يول (نهاية الخط) أو الحرف المحدد. عندما تتم قراءة أو كتابة حرف يول، يتم إجراء ترجمة داخلية معينة. ملف ثنائي. وهو ملف يحتوي على معلومات في نفس الشكل كما هو مقيد في الذاكرة. في الملفات الثنائية، لا يتم استخدام محددات لخط ولا تحدث ترجمة هنا. فئات لتشغيل ملف تيار من التيار. فئة ستريم للكتابة على الملفات إفستريم. فئة تيار للقراءة من الملفات فستريم: فئة تيار إلى كل من القراءة والكتابة من الملفات. فتح ملف فتح الملف باستخدام منشئ من إخراج أوتفيل (quotsample. txtquot) الإخراج فقط إفستريم إنفيل (ldquosample. txtrdquo) الإدخال فقط فتح الملف باستخدام فتح () Stream-object. open (لدكوفيلناميردكو، واسطة) من خارج أوتفيل outFile. open (quotsample. txtquot ) إفستريم إنفيل inFile. open (quotsample. txtquot) معلمة وضع الملف
No comments:
Post a Comment