البرمجة

تحسين برنامج النسخ الديناميكي للنصوص في لغة C

في البرنامج الذي قدمته، يُلاحظ وجود بعض الأخطاء والتحسينات التي يمكن إجراؤها لضمان عمل البرنامج بشكل صحيح. أولًا وقبل كل شيء، يجب التأكد من إغلاق الملف بعد استخدامه. يمكن القيام بذلك باستخدام fclose(in) في نهاية الدالة main.

ثانيًا، يُفضل استخدام strncpy بدلاً من strcat عند نسخ النص إلى الذاكرة الديناميكية لتجنب مشاكل الطابور الذي يمكن أن تحدث عند استخدام strcat في كل دورة.

ثالثًا، يجب تحديث قيمة bufflen في كل دورة من الحلقة while لتكون تمثل الحجم الفعلي للنص المقروء، وليس حجم البايتات التي تم قراءتها في الدورة السابقة. يمكن القيام بذلك باستخدام bufflen = strlen(buffer) داخل حلقة while.

رابعًا، يمكن استخدام calloc(1, sizeof(char)) لتخصيص ذاكرة بحجم 1 بايت في البداية، بدلاً من calloc(bufflen, sizeof(char))، لأنك تريد بداية بحجم صفر وتزيد حجم الذاكرة بناءً على احتياجات البرنامج.

ختامًا، يجب التأكد من أن الملف “keimeno.txt” موجود في نفس مجلد البرنامج أو تحديد المسار الكامل إذا كان في مكان آخر.

إليك إصدار معدل من البرنامج:

c
#include #include #include int main() { FILE *in = fopen("keimeno.txt", "r"); if (in == NULL) { perror("Error opening file"); return 1; } int fullbufflen = 0, i; char buffer[100]; char *text = calloc(1, sizeof(char)); while (fgets(buffer, 100, in) != NULL) { int bufflen = strlen(buffer); text = realloc(text, (fullbufflen + bufflen + 1) * sizeof(char)); strncpy(text + fullbufflen, buffer, bufflen); fullbufflen += bufflen; } fclose(in); for (i = 0; i < fullbufflen; i++) { printf("%c\n", text[i]); } free(text); return 0; }

هذا البرنامج ينسخ محتوى الملف “keimeno.txt” إلى ذاكرة ديناميكية ويطبع النتيجة بشكل صحيح.

المزيد من المعلومات

بالطبع، دعونا نوسع المناقشة حول بعض النقاط المهمة في البرنامج وتحسينه:

  1. التعامل مع أخطاء الفتح:
    يتم فحص ما إذا كان من الممكن فتح الملف بنجاح باستخدام fopen. إذا لم يكن الفتح ناجحًا (يُظهر ذلك بإرجاع NULL للمؤشر على الملف)، يتم استدعاء perror لطباعة رسالة خطأ تفيد السبب.

  2. التحقق من نجاح الفعاليات الديناميكية:
    قبل استخدام نتائج الوظائف الديناميكية مثل calloc و realloc، يجب دائمًا التحقق من نجاح تلك العمليات. في الشيفرة المحدثة، لاحظ استخدام if (in == NULL) واستخدام if (text == NULL) بعد استخدام realloc.

  3. التحكم في الذاكرة الديناميكية:
    بعد استخدام الذاكرة الديناميكية، يجب دائمًا تحريرها باستخدام free لتجنب تسرب الذاكرة. في هذا البرنامج، يتم استخدام free(text) في نهاية البرنامج.

  4. التحقق من نهاية الملف:
    في حلقة while، يتم استخدام fgets لقراءة الأسطر من الملف. يجب التحقق من نهاية الملف باستخدام feof لتجنب القراءة الزائدة.

  5. التحكم في حجم النص النهائي:
    يمكن أن يكون من الجيد توفير طريقة لتخزين حجم النص النهائي، سواء كمتغير عددي يتم طباعته في النهاية أو كجزء من النص نفسه.

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

باختصار، الشيفرة المحدثة تحاول حل العديد من المشاكل المحتملة وتعزز قابلية قراءة الكود وفهمه.

زر الذهاب إلى الأعلى