سؤال

لقد تم تكليفه بكتابة برنامج لجمع البيانات لـ Unitech HT630, ، الذي يدير نظام تشغيل DOS ذي الملكية التي يمكنها تشغيل المواد التنفيذية التي تم تجميعها لـ 16 بت من MS DOS مع بعض القيود. أنا أستخدم برنامج التحويل البرمجي الرقمي MARS C/C ++ ، والذي يعمل بشكل جيد حتى الآن.

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

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

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

في وضع سجل تقلص ، بعد السجل الأخير في الملف ، تركت أي بيانات كانت جالسة هناك قبل التحول. لقد كنت أكتب محدد EOF في الملف بعد "حفظ السجل المتقلص" للإشارة إلى مكان نهاية سجلاتي وإملاء البيانات المتبقية ، ولكن بعد ذلك لم يعد لدي ملف نظيف حتى "سجل متزايد" يمتد حجم الملف فوق المنطقة المليئة بالمساحة. ال truncate() وظيفة في unistd.h لا يعمل (أنا الآن أعتقد أن هذا هو *Nix النكهات فقط؟).

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

لقد نظرت إلى قائمة مقاطعة رالف براون ومرجع المقاطعة في IBM PC Assembly Language and Programming ولا يمكنني العثور على أي شيء لتحديث حجم الملف أو ما شابه.

هل تقليل حجم الملف دون إنشاء ملف ثانٍ ممكن في DOS؟

هل كانت مفيدة؟

المحلول

لتقليل حجم الملف في DOS ، تسعى إلى نقطة الاقتطاع int 21 (ax=4200h, bx=handle, cx:dx=offset) واتصل اكتب مع طول الصفر: int 21 (ax=4000h, bx=handle, cx=0 (معنى اقتطاع))

نصائح أخرى

كبديل لتحويل السجلات حولها عند تغيير حجم السجل ، يمكنك إنهاء كل سجل بحقل "PAD" الذي يقوم بوسادة الحجم القياسي (على سبيل المثال مع المسافات أو ما شابه).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top