ما هو الملف الثنائي. ملف ثنائي

08.04.2019

الوصف والتمثيل الداخلي للملفات

الملفات مختلفة عن بعضها البعض. جميع الملفات المخزنة على جهاز الكمبيوتر لها سمات خاصة، أي. طرق وصف خاصة تسمح لك بتمييز ملف عن آخر: 1) الاسم؛ الحجم 2؛ 3) التاريخ والوقت؛ 4) أيقونة.

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

كل ملف له حجم فعلي. يشغل الملف بعضًا من ذاكرة الكمبيوتر وبعض مساحة القرص.

عند إنشاء ملف، يقوم نظام التشغيل بوضع ختم عليه يشير إلى تاريخ ووقت الإنشاء. يتيح لك هذا فرز الملفات حسب التاريخ والوقت وبالتالي تنظيم جهاز الكمبيوتر الخاص بك. يتم أيضًا تدوين تاريخ ووقت تحديث الملف أو تعديله.

كل ملف هو نوع محدد، يرتبط ارتباطًا وثيقًا برمز الملف الذي نراه. يعتمد نوع الملف على محتواه. يقوم كل برنامج بتعيين نوع معين وأيقونة مقابلة للمستند الذي تم إنشاؤه.

يتم قياس حجم الملف بالبايت، تمامًا مثل سعة الذاكرة.

يمكن أن يكون حجم الملف 0 بايت، مما يعني أن الملف موجود ولكنه لا يحتوي على أي شيء. S الحد الأقصى لحجم الملف هو 4 جيجابايت. لكن مثل هذه الملفات الضخمة نادرة جدًا.

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

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

الملفات النصية والثنائية

تتيح الملفات للمستخدم قراءة كميات كبيرة من البيانات مباشرة من القرص دون الحاجة إلى إدخالها من لوحة المفاتيح. هناك نوعان رئيسيان من الملفات: النص والثنائي.

نصيتم استدعاء الملفات التي تتكون من أي أحرف. وهي منظمة في أسطر، ينتهي كل منها بـ " نهاية الخط". تتم الإشارة إلى نهاية الملف نفسه بالرمز " نهاية الملف". عند كتابة المعلومات في ملف نصي، والذي يمكن عرضه باستخدام أي محرر نصوص، يتم تحويل جميع البيانات إلى نوع حرف وتخزينها في شكل حرف.

في ثنائي Xملفاتتتم قراءة المعلومات وكتابتها على شكل كتل ذات حجم معين، حيث يمكن تخزين البيانات من أي نوع وبنية.

للعمل مع الملفات، تسمى أنواع البيانات الخاصة تيارات.يتم استخدام دفق ifstream للعمل مع الملفات في وضع القراءة، ويتم استخدام ifstream في وضع الكتابة. للعمل مع الملفات في وضعي الكتابة والقراءة، يتم استخدام دفق ifstream.

في برامج C++، عند العمل مع الملفات النصية، يجب عليك تضمين مكتبات ifstream وiostream.

لكتابة البيانات في ملف نصي، يجب عليك: 1) وصف متغير النوع ofstream يفتح; 3) إخراج المعلومات إلى ملف؛ 4) تأكد من إغلاق الملف.

لقراءة البيانات من ملف نصي، يجب عليك:

1) وصف متغير النوع com.ifstream; 2) افتح الملف باستخدام الوظيفة يفتح; 3) قراءة المعلومات من ملف؛ عند قراءة كل جزء من البيانات، من الضروري التحقق مما إذا تم الوصول إلى نهاية الملف؛ 4) أغلق الملف.

تجدر الإشارة إلى أنه في جميع الأمثلة التي تمت مناقشتها أعلاه، تقوم الدالة fopen() في الوضعين "r" و"w" بفتح ملف نصي للقراءة والكتابة، على التوالي. وهذا يعني أن بعض أحرف تنسيق النص، مثل حرف الإرجاع '\r'، لا يمكن قراءتها كأحرف منفصلة؛ وقد لا تكون موجودة في الملف، ولكنها موجودة. هذه هي إحدى ميزات وضع النص للملف. لمزيد من العمل "الجيد" مع محتويات الملف، يوجد وضع ثنائي يمثل محتويات الملف كسلسلة من البايتات، حيث تكون جميع رموز التحكم الممكنة مجرد أرقام. في هذا الوضع يمكن إزالة أو إضافة أحرف التحكم غير المتوفرة في وضع النص. من أجل فتح ملف في الوضع الثنائي، يتم استخدام الدالة fopen() أيضًا مع المعلمة الأخيرة التي تساوي "rb" و"wb"، على التوالي، للقراءة والكتابة.

الملف الثنائي هو أي ملف موجود على جهاز الكمبيوتر الخاص بك. يتم تسجيل جميع المعلومات الموجودة على جهاز الكمبيوتر والوسائط ذات الصلة بالبت (ومن هنا الاسم). ومع ذلك، للمقارنة، يمكن قراءة ملف نصي في أجهزة القراءة المقابلة للامتداد (أبسطها - حتى في المفكرة)، ولكن لا يمكن قراءة الملف القابل للتنفيذ. وعلى الرغم من أن ملف txt هو في الواقع نفس الملف الثنائي، إلا أنهم عندما يتحدثون عن مشكلة فتح محتويات الملفات الثنائية، فإنهم يقصدون الملفات القابلة للتنفيذ، وكذلك البيانات المضغوطة.

سوف تحتاج

  • - برنامج التحرير الهيكس .

تعليمات

  • قم بتنزيل برنامج Hex Edit على محرك الأقراص الثابتة لديك - وهو محرر ملفات يمثل محتوياتها في شكل ثنائي. افتح البرنامج بالنقر المزدوج على ملف البداية. يتيح لك هذا البرنامج قراءة الملفات الثنائية في الوقت الفعلي وتغيير المحتوى وإضافة إدخالاتك الخاصة وغير ذلك الكثير. للعمل بشكل كامل في هذه البيئة، تحتاج إلى معرفة القليل عن المفاهيم العامة للملفات الثنائية.
  • لا تختلف نافذة البرنامج كثيرًا عن المحرر العادي: قوائم مألوفة ولوحة بها أزرار ونص الملف الذي يتم تحريره والإشارات المرجعية وشريط الحالة. افتح الملف الثنائي من خلال قائمة "ملف" أو من خلال النقر على الأيقونة المقابلة على اللوحة. سيظهر أمامك الملف الثنائي على شكل سلاسل تحتوي على أرقام وحروف. لا تخلط بين هذه الأحرف والبيانات المطبوعة في الملفات النصية. يمكنك أيضًا تحريرها عن طريق حذف الأحرف، ولكن في هذه الحالة ستحذف الخلايا التي تحتوي على بيانات، أو أجزاء من الملف.
  • قم بإجراء تغييرات على محتويات الملف. يمكن أن يعرض التطبيق أجزاء مهمة من الملف لتسهيل البحث، ويحتوي أيضًا على إعدادات مرنة لعرض التعليمات البرمجية الثنائية بيانيًا. قم بتبديل عرض المحتوى إلى وضع ASCII+IBM/OEM لرؤية رمز الملف. إذا قمت بإدخال أسطر غير صحيحة في ملف ما، فقد لا يعمل بشكل صحيح، مما يتسبب في عواقب وخيمة على نظام تشغيل الكمبيوتر الشخصي الخاص بك.
  • احفظ تغييراتك. إذا لم تكن لديك خبرة في هذا النوع من تحرير الملفات، فكن مستعدًا لحقيقة أن الملف لن يفتح ويرفض العمل بعد إجراء التغييرات. من المحتمل أن تفسد بعض النسخ قبل أن تحصل عليها بشكل صحيح. حاول عدم حفظ كافة التغييرات التي تم إجراؤها على الملف الأصلي حتى تظل محتوياته دون تغيير.
  • في المثال أعلاه، الخيار "الأطول" هو "b": فهو يتطلب 23 بايت (21 بايت للسلسلة و2 بايت للعدد الصحيح). يتطلب الخياران "n" و"m" 4 و5 بايت على التوالي (انظر الجدول).

    الاسم، عنصر الناشر الجزء البديل

    الملفات الثنائية

    تقوم الملفات الثنائية بتخزين المعلومات بالشكل الذي يتم تقديمها به في ذاكرة الكمبيوتر، وبالتالي فهي غير ملائمة للبشر. بالنظر إلى مثل هذا الملف، من المستحيل فهم ما هو مكتوب فيه؛ ولا يمكن إنشاؤه أو تصحيحه يدويًا - في بعض برامج تحرير النصوص - وما إلى ذلك. ومع ذلك، يتم تعويض كل هذه المضايقات من خلال سرعة العمل مع البيانات.

    بالإضافة إلى ذلك، يتم تصنيف الملفات النصية على أنها هياكل وصول تسلسلية، بينما يتم تصنيف الملفات الثنائية على أنها هياكل وصول مباشر. وهذا يعني أنه يمكنك في أي وقت الوصول إلى أي شخص، وليس فقط العنصر الحالي للملف الثنائي.

    الملفات المكتوبة

    لا يمكن قراءة متغيرات أنواع البيانات المنظمة (باستثناء السلسلة) من ملف نصي. على سبيل المثال، إذا كنت بحاجة إلى إدخال بيانات من ملف نصي لملء سجل اللعبة بمعلومات حول الألعاب المتوفرة للبيع (اسم المنتج وسعر المنتج والفئة العمرية المخصصة للعبة):

    العمر: مجموعة من 0..18؛ (المحددة في الملف حسب الحدود)

    ثم سيكون عليك كتابة الكود التالي:

    ج:شار; أنا، ي، دقيقة، ماكس: عدد صحيح؛

    أ: مجموعة من الألعاب؛

    ابدأ في التعيين (f، الإدخال)؛ إعادة تعيين (و)؛

    لأني:=1 إلى 100 أفعل إذا لم يكن eof(f)

    ثم مع [i] افعل

    ابدأ readln(f,name,price,min,max); العمر:=;

    for j:= min to max do age:=age+[j];

    كما ترون، فإن مثل هذه القراءة عنصرًا تلو الآخر غير مريحة للغاية وتتطلب عمالة مكثفة.

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

    شرط لا غنى عنه لتنظيم الوصول المباشر إلى عناصر الملف الثنائي: كما في حالة المصفوفات، إذا كان طول كل مكون من مكونات البنية معروفًا بالضبط، فيمكن حساب عنوان أي مكون باستخدام صيغة بسيطة جدًا:

    <начало_структуры> + <номер_компонента>*<длина_компонента>

    وصف الملفات المكتوبة

    يوجد في قسم var متغيرات ملفات مصممة للعمل معها الملفات المكتوبة، موضحة على النحو التالي:

    فار<файловая_перем>: ملف<тип_элементов_файла>;

    لا يمكن تحديد أي متغير ملف كثابت.

    الغرض من الملف المكتوب

    ومن الآن وحتى نهاية القسم سنقصد بكلمة "ملف" " الملف الثنائي المكتوب"(بالطبع، ما لم ينص على خلاف ذلك على وجه التحديد).

    فريق تعيين (و،"<имя_файла>"); يعمل على إنشاء اتصال بين متغير الملف واسم الملف الذي سيكون هذا المتغير مسؤولاً عن العمل فيه.

    خط "<имя_файла>" قد يحتوي على المسار الكامل للملف. إذا لم يتم تحديد المسار، فسيتم اعتبار الملف موجودًا في نفس الدليل مثل الوحدة النمطية القابلة للتنفيذ للبرنامج.

    فتح وإغلاق ملف مكتوب

    اعتمادًا على الإجراءات التي سيقوم بها برنامجك مع الملف الذي يتم فتحه، يمكن فتحه بطريقتين:

    إعادة تعيين (و)؛ - فتح ملف لقراءة المعلومات منه وفي نفس الوقت الكتابة فيه (في حالة عدم وجود مثل هذا الملف، ستؤدي محاولة فتحه إلى حدوث خطأ). يتم استخدام نفس الأمر لإرجاع المؤشر إلى بداية الملف؛

    إعادة كتابة (و)؛ - فتح ملف لكتابة المعلومات إليه؛ إذا كان هذا الملف غير موجود، فسيتم إنشاؤه؛ إذا كان الملف الذي يحمل نفس الاسم موجودًا بالفعل، فستختفي جميع المعلومات الموجودة فيه مسبقًا.

    يتم إغلاق الملفات المكتوبةالإجراء Close(f) شائع في جميع أنواع الملفات.

    القراءة من ملف مكتوب

    تتم القراءة من ملف مفتوح للقراءة باستخدام أمر القراءة (). بين قوسين، تتم الإشارة إلى اسم متغير الملف أولاً، ثم قائمة الإدخال 1):

    يمكنك فقط إدخال متغيرات من النوع المطابق للإعلان من ملف، ولكن يمكن أيضًا تنظيم نوع البيانات هذا. لنفترض أننا إذا عدنا إلى المثال الوارد في بداية الفقرة ". الملفات المكتوبة"، فسيصبح من الواضح أن الاستخدام الملف المكتوببدلاً من النص سوف يقلل بشكل كبير من نص البرنامج:

    اكتب لعبة = اسم السجل: سلسلة؛ السعر: حقيقي؛

    العمر: مجموعة من 0..18؛ (محددة بالحدود)

    var f: ملف اللعبة؛

    أ: مجموعة من الألعاب؛ يبدأ

    تعيين (و، الإدخال)؛

    لأني: = 1 إلى 100 افعل

    إذا لم يكن eof(f) فاقرأ(f,a[i]); إغلاق (و)؛

    البحث في ملف مكتوب

    تقوم الدالة eof(f:file):boolean، المألوفة لدينا بالفعل، بالإبلاغ عند الوصول إلى نهاية الملف. لا يمكن تطبيق جميع وظائف "نهاية البحث" الأخرى (eoln() وseekeof() وseekeoln()) المتأصلة في الملفات النصية على الملفات المكتوبة.

    ولكن هناك إجراءات فرعية خاصة تسمح لك بالعمل معها الملفات المكتوبةكما هو الحال مع هياكل الوصول المباشر:

    1. ستبلغ وظيفة filepos(f:file):longint عن الموضع الحالي للمؤشر في filef. إذا كانت تشير إلى نهاية ملف يحتوي على عناصر N، فستُرجع هذه الوظيفة النتيجة N . من السهل شرح ذلك: يتم ترقيم عناصر الملف بدءًا من الصفر، وبالتالي يتم ترقيم العنصر الأخير بـ N-1. وبالتالي فإن numberN ينتمي إلى عنصر "غير موجود" - علامة نهاية الملف.

    2. دالة File(f:file):longint ستحسب طول الملف f .

    3. سيؤدي إجراء البحث (f:file,n:longint) إلى تحريك المؤشر في الملف f إلى بداية رقم السجل N . إذا تبين أن n أكبر من الطول الفعلي للملف، فسيتم نقل المؤشر إلى ما بعد النهاية الفعلية للملف.

    4. سيؤدي الإجراء truncate(f:file) إلى قطع "ذيل" الملف: ستتم إزالة جميع العناصر من الملف الحالي حتى نهاية الملف منه. في الواقع، سيتم إعادة كتابة علامة "نهاية الملف" فقط إلى المكان الذي أشار إليه المؤشر، وستبقى القيم "المقطوعة" فعليًا في أماكنها الأصلية - ستصبح ببساطة "يتيمة".

    الكتابة إلى ملف مكتوب

    يمكنك حفظ المتغيرات في ملف مفتوح للكتابة باستخدام الأمر write(). كما هو الحال مع القراءة، يتم إدراج متغير الملف أولاً، متبوعًا بقائمة المخرجات:

    اكتب (و، أ، ب، ج)؛ - الكتابة إلى الملف f (المفتوح مسبقًا للكتابة باستخدام أوامر إعادة الكتابة (f) أو إعادة تعيين (f)) المتغيرات a , b , c .

    مخرجات الى الملف المكتوبيُسمح فقط بالمتغيرات التي تطابق وصف نوع البيانات. لا يمكن طباعة الثوابت غير المسماة وغير المكتوبة

    الملف المكتوب.

    الملفات المكتوبةتعتبر هياكل الوصول المباشر والمتسلسل. وهذا يعني أن الكتابة ممكنة ليس فقط في نهاية الملف، ولكن أيضًا على أي عنصر آخر. ستحل القيمة المكتوبة محل القيمة السابقة في هذا العنصر (سيتم "الكتابة فوق" القيمة القديمة).

    على سبيل المثال، إذا كنت بحاجة إلى استبدال العنصر الخامس من الملف بالقيمة المخزنة في المتغير a، فستكتب مقتطف البرنامج التالي:

    تسعى(و,5); (سيتم ضبط المؤشر على بداية العنصر الخامس)

    اكتب (و، أ)؛ (سيتم ضبط المؤشر على بداية العنصر السادس)

    غالبًا ما يكون لدى الكثير من الأشخاص سؤال حول كيفية فتح ملف ثنائي. هذا المستند هو أي ملف موجود على جهاز كمبيوتر شخصي. عادةً ما يتم تسجيل جميع البيانات الموجودة على أجهزة الكمبيوتر والوسائط المرتبطة بها بالبت. ومن هذه الكلمة يأتي الاسم. إذا استخدمت ملفًا نصيًا بسيطًا للمقارنة، فلن تكون هناك مشاكل في قراءته. للقيام بذلك، يكفي أن يكون لديك محرر عادي على جهاز الكمبيوتر الخاص بك؛ حتى المفكرة ستفي بالغرض. لفتح ملف ثنائي، لن تتمكن من استخدام المفكرة البسيطة. وإذا تحدثنا عن حقيقة أن المعلومات الموجودة في الملفات النصية مشفرة بنفس البتات، فعادةً عندما يتحدثون عن قراءة الملفات الثنائية، فإنهم يقصدون المستندات القابلة للتنفيذ.

    تعليمات للعمل

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

    ثانيا، عليك أن تتعرف على نافذته الرئيسية، والتي لا تختلف كثيرا عن نافذة المحرر العادي. نفس الأزرار ونفس القائمة ونص المستند والإشارات المرجعية وأشرطة الحالة. يمكنك فتح الملف محل الاهتمام من خلال علامة التبويب "ملف" أو من خلال زر خاص موجود في البرنامج. بعد ذلك ستتمكن من رؤية الملف القابل للتنفيذ والذي سيظهر على شكل أرقام وحروف. يجب ألا تخلط بين الرموز التي يتم بها تمثيل الملف الثنائي وتلك الموجودة في المحرر العادي. في حالة اتخاذ قرار بحذف أو تغيير أي جزء من الوثيقة، ينبغي أن يكون مفهوما أن جزءا منها سوف يختفي أو يتغير.

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

    رابعا، بعد تغيير أو حذف أو إضافة بيانات معينة في ملف، يجب عليك حفظ نتيجة عملك. إذا لم تكن لديك خبرة كافية في تحرير الملفات، فيجب أن تكون مستعدًا لعواقب ليست ممتعة تمامًا. على سبيل المثال، قد يتوقف المستند عن العمل بعد تغيير البيانات. وإلى أن تبدأ في فهم هذه المشكلة جيدًا، ستتعرض الكثير من نسخ الملفات للتلف. إذا لم تكن واثقا من قدراتك، فلا ينبغي عليك تغيير البيانات بنفسك، خاصة في المواقف التي يحتاج فيها الملف الثنائي Su إلى التصحيح.

    لقد أظهرت الأمثلة التي أخذناها في الاعتبار حتى الآن إدخال/إخراج المعلومات المنسقة في الملفات. يُنصح باستخدام إدخال/إخراج أرقام الملفات المنسقة فقط عندما تكون صغيرة الحجم والكمية، وكذلك عندما يكون من الضروري توفير القدرة على عرض الملفات باستخدام وسائل غير برمجية. خلاف ذلك، بالطبع، يكون استخدام الإدخال/الإخراج الثنائي أكثر كفاءة، والذي يخزن الأرقام بنفس الطريقة كما في OP للكمبيوتر، بدلاً من سلاسل الأحرف. اسمحوا لي أن أذكرك أن القيمة الصحيحة (int) أو القيمة الحقيقية (العائمة) تشغل 4 بايت في الذاكرة، والقيمة المزدوجة تشغل 8 بايت، وقيمة char تشغل 1 بايت. على سبيل المثال، الرقم 12345 في ملف نصي (منسق) يستغرق 5 بايت، وفي الملف الثنائي يستغرق 4 بايت.

    الملفات الثنائية، أي. يتم استخدام الملفات التي يتم تخزين المعلومات فيها في نموذج تمثيل داخلي للاستخدام اللاحق بواسطة البرنامج؛ تتمثل ميزة الملفات الثنائية في أنه، أولاً، عند القراءة/الكتابة، لا يضيع الوقت في تحويل البيانات من الشكل الرمزي للتمثيل إلى الشكل الداخلي والعكس، وثانيًا، لا يوجد فقدان لدقة الأرقام الحقيقية. سواء في حالة الإدخال/الإخراج المنسق أو في حالة الإدخال/الإخراج الثنائي، من أجل معالجة المعلومات "بشكل صحيح" من ملف، تحتاج إلى معرفة أنواع البيانات، وكيف وبأي تسلسل تتم كتابتها إلى الملف الثنائي ملف، خاصة وأن عرض ملف ثنائي باستخدام محرر نصوص لن يؤدي إلى أي شيء.

    لنفكر في مثال يوضح كتابة العناصر الصحيحة لمصفوفة ديناميكية إلى ملف ثنائي وقراءتها من هذا الملف.

    #يشمل

    #يشمل

    #يشمل

    استخدام اسم للمحطة؛

    cout<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> ن؛

    int *mas = new int [N];

    ل(ط=0;ط

    cout<< " Vvedite " << i << "-i element: "; cin >> ماس[i];

    cout<< "\nIdet zapis dannyh v fail..." << endl;

    ofstream fout("c:\\os\\bin.dat"، ios::binary);//مخلوق مخرج تيار ثنائي

    إذا (! fout) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

    fout.write(reinterpret_cast (ماس)، N*sizeof(int));//اكتب المصفوفة إلى الملف

    fout. Close();// إغلاق الدفق

    cout<< "Dannye uspeshno zapisany!" << endl;

    ل(ط=0;ط

    ifstream fin("c:\\os\\bin.dat"، ios::binary); // أنشئ موضوعًا لقراءة الملف

    إذا (! زعنفة) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

    cout<< "Fail sodergit:" << endl;

    fin.read(reinterpret_cast (ماس)، N*sizeof(int));// قراءة المصفوفة من الملف

    ل(ط=0;ط

    getch(); العودة 0؛

    في هذا البرنامج، يجب إيلاء اهتمام خاص لاستخدام الدالتين write() (طريقة فئة ofstream) وread() (طريقة فئة ifstream). تفكر هذه الوظائف في البيانات من حيث البايتات وهي مصممة لنقل عدد معين من البايتات من مخزن البيانات المؤقت إلى ملف والعودة مرة أخرى. معلمات هذه الوظائف هي عنوان المخزن المؤقت وطوله بالبايت.

    تم تصميم وظيفة write() لتكتب إلى ملف عدد البايتات المحددة في المعلمة الثانية من تلك المحددة في المعلمة الأولى عناوينالمخزن المؤقت للبيانات، وتم تصميم وظيفة القراءة () لقراءة البيانات من الملف. وتجدر الإشارة هنا إلى أن هذه الوظائف تعمل مع مخزن بيانات مؤقت من النوع char فقط. في هذا الصدد، في هذا البرنامج استخدمنا المشغل reinterpret_cast<> ، والذي يحول المخزن المؤقت للبيانات الخاص بنا من النوع int (mas) إلى مخزن مؤقت من النوع char.

    من المهم أن نتذكر أن الصب باستخدام المشغل reinterpret_cast ضروري فقط في الحالات التي تكون فيها المعلمة الأولى من الوظائفيكتب() ويقرأ() ليست مصفوفة أحرف (بعد كل شيء، حرف من النوعشار يأخذ بايت واحد فقط).بالإضافة إلى ذلك، إذا كنت بحاجة إلى كتابة أو قراءة ليس مصفوفة، بل متغيرات فردية، فأنت بحاجة إلى استخدام آلية مرجعية (رابط إلى عنوان المخزن المؤقت للبيانات)، على سبيل المثال:

    ofstream fout(filename, ios::app | ios::binary);

    fout.write(reinterpret_cast (& cb)، sizeof(float));

    الآن من الضروري مناقشة المعلمة الثانية للوظائف قيد النظر. في هذا البرنامج، استخدمنا التعبير N*sizeof(int) كمعلمة ثانية، والذي بواسطته قمنا بحساب عدد البايتات. على سبيل المثال، إذا كان لدينا 5 عناصر مصفوفة أعداد صحيحة، فسيكون عدد البايتات 20. ترجع الدالة sizeof() عدد البايتات المخصصة لنوع البيانات المحدد كمعلمة. على سبيل المثال حجم( كثافة العمليات) سوف يعود 4.

    لذا، فإن البرنامج الوارد في هذا المثال يسمح لك بكتابة البيانات في شكل ثنائي إلى ملف bin.dat وقراءتها من هذا الملف الثنائي. علاوة على ذلك، بعد القراءة، يتم تحويل هذه البيانات إلى نوع int، وتكتسب بنية مصفوفة، ويمكن إجراء أي عمليات باستخدامها.

    الآن، تخيل أنك بحاجة إلى كتابة برنامج يسمح لك بقراءة البيانات من ملف bin.dat، ونحن نعلم فقط أن هذا الملف يحتوي على عناصر مصفوفة أعداد صحيحة في شكل ثنائي. عدد العناصر المكتوبة (ن ) نحن لا نعلم. عند إنشاء برنامج، ليس لدينا الحق في استخدام مصفوفة ثابتة، أي. تخصيص الذاكرة له في مرحلة إنشاء البرنامج. سيؤدي هذا إلى نتيجة خاطئة. لأن قيمة N صغيرة جدًا لن تؤدي إلى حساب جميع عناصر المصفوفة، وستؤدي قيمة N الكبيرة جدًا إلى ملء الخلايا الإضافية بقيم عشوائية.

    لنفكر في مثال لبرنامج يسمح لك بقراءة عناصر مصفوفة أعداد صحيحة من ملف ثنائي عن طريق تخصيص الذاكرة ديناميكيًا، ولإثبات واقعية البيانات المقروءة، قم بحساب مجموعها.

    #يشمل

    #يشمل

    #يشمل

    استخدام اسم للمحطة؛

    int N, i, sum=0, dfb; //dfb - طول الملف بالبايت

    ifstream زعنفة("c:\\os\\bin.dat"، دائرة الرقابة الداخلية::ثنائي);

    إذا (! زعنفة) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

    fin.seekg(0, ios::end);// اضبط موضع القراءة على نهاية الملف (0 بايت من النهاية)

    dfb = fin.tellg();// احصل على قيمة موضع نهاية الملف (بالبايت)

    ن=دفب/4;// مع العلم أن العدد الصحيح يأخذ 4 بايت، احسب عدد الأرقام

    int *arr = new int [N];// إنشاء مصفوفة ديناميكية

    fin.seekg(0, ios::beg);// قبل قراءة البيانات، انقل الموضع الحالي إلى بداية الملف

    fin.read(reinterpret_cast (آر)، دفب)؛

    cout<< "Iz faila schitano " << N << " elementov:" << endl;

    ل(ط=0;ط

    ل(ط=0;ط

    cout<< "\n Ih summa = " << sum;

    getch(); العودة 0؛

    دعونا نلقي نظرة فاحصة على هذا البرنامج، الذي استخدمنا فيه بشكل فعال وظائف Seekg () و Tellg ()، وهي أساليب فئة ifstream. وتجدر الإشارة هنا إلى أن يرتبط أي ملف عند فتحه بما يسمى بموضع القراءة أو الكتابة الحالي. عند فتح ملف للقراءة، يتم تعيين هذا الموضع الافتراضي على بداية الملف. ولكن في كثير من الأحيان يكون من الضروري التحكم في الموضع يدويًا حتى تتمكن من القراءة والكتابة بدءًا من موقع عشوائي في الملف. تتيح لك الدالتان requestg() وtellg() ضبط مؤشر القراءة الحالي والتحقق منه، بينما تفعل الدالتان searchp() وtellp() نفس الشيء بالنسبة لمؤشر الكتابة.

    تقوم طريقة Seekg(1_parameter, 2_parameter) بنقل موضع القراءة الحالي من الملف بعدد البايتات المحددة في المعلمة 1 بالنسبة إلى الموقع المحدد في المعلمة الثانية. 2_يمكن أن تأخذ المعلمة إحدى القيم الثلاث:

    ios::beg – من بداية الملف؛

    ios::cur - من الوضع الحالي؛

    ios::end – من نهاية الملف.

    هنا beg وcur وend هي ثوابت محددة في فئة ios، والرموز:: تمثل عملية الوصول إلى هذه الفئة. على سبيل المثال، المشغل fin.seekg(-10, ios::end);يسمح لك بتعيين موضع القراءة الحالي من ملف إلى 10 بايت قبل نهاية الملف.

    الآن دعنا نعود إلى وصف عمل البرنامج. بناءً على أننا لا نعرف عدد الأرقام المكتوبة في الملف، علينا أولاً معرفة عدد الأرقام. للقيام بذلك، باستخدام fin.seekg(0, ios::end);ننتقل إلى نهاية الملف، وباستخدام الدالة Tellg()، نعيد طول الملف بالبايت إلى المتغير dfb. تقوم الدالة Tellg() بإرجاع موضع المؤشر الحالي بالبايت. وبما أننا نعرف طول عدد صحيح واحد بالبايت (4 بايت)، فإنه من السهل حساب عدد الأرقام المكتوبة على الملف، معرفة طول الملف بالبايت ( ن=دفب/4;). بعد معرفة عدد الأرقام، نقوم بإنشاء مصفوفة ديناميكية والانتقال إلى بداية الملف لبدء قراءة البيانات باستخدام وظيفة القراءة (). بعد نقل العدد المحدد من بايتات البيانات (dfb) إلى المخزن المؤقت للبيانات (arr)، تكتسب البيانات المقروءة بهذه الطريقة بنية مصفوفة وتصبح مناسبة تمامًا لأي عمليات وتحويلات برمجية.