البرمجة

حل مشكلة طباعة الأرقام إلى ملف نصي في C

تبدو المشكلة التي تواجهها مرتبطة بالتعامل مع النصوص والأحرف في لغة البرمجة C، وبالتحديد في استخدام الدالة fprintf لطباعة النص إلى ملف نصي. في الكود المعطى، تقوم بتحويل العدد الصحيح إلى نص باستخدام دالة sprintf، ثم تقوم بطباعة هذا النص إلى ملف نصي باستخدام دالة fprintf. ومع ذلك، يبدو أن النتيجة التي تحصل عليها في الملف ليست النتيجة المتوقعة، بل تبدو كالنصوص غير المرغوب فيها.

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

لحل هذه المشكلة، يمكنك تخصيص مساحة في الذاكرة بشكل دائم لتخزين النص الناتج من دالة test_string(). يمكنك استخدام وظيفة تخصيص الذاكرة مثل malloc() لتخصيص مساحة في الذاكرة، ثم يمكنك إعادة تنظيم الكود ليقوم بتحرير هذه الذاكرة بعد الانتهاء من استخدامها.

فيما يلي تعديل لكودك يستخدم malloc() لحجز مساحة في الذاكرة للنص، ويحرر هذه المساحة بعد طباعة النص إلى الملف:

c
#include #include char * test_string() { char *s = (char *)malloc(5 * sizeof(char)); // حجز مساحة في الذاكرة int num = 123; sprintf(s, "%d", num); return s; } int save() { FILE *fh = fopen("test.txt", "w"); if (fh == NULL) { printf("Error opening file.\n"); return -1; } char *text = test_string(); if (text == NULL) { printf("Memory allocation failed.\n"); fclose(fh); return -1; } fprintf(fh, "%s", text); fclose(fh); free(text); // تحرير الذاكرة بعد الانتهاء من استخدامها return 0; } int main() { if (save() == 0) { printf("File saved successfully.\n"); } else { printf("Error saving file.\n"); } return 0; }

باستخدام هذا التعديل، يتم الآن حجز مساحة في الذاكرة للنص المنتج في دالة test_string() باستخدام malloc()، ثم يتم تحرير هذه المساحة بعد الانتهاء من استخدامها في دالة save() باستخدام free()، مما يضمن أن النص يظل صالحًا عندما يتم استخدامه في دالة fprintf().

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

بعد إجراء التعديلات المناسبة على الكود، يمكننا الآن التأكد من أن النص يتم طباعته بشكل صحيح إلى ملف النص. يتم ذلك عن طريق استدعاء الدالة save() في دالة main() وفحص قيمة العودة للتأكد من نجاح العملية.

الآن، بعد تشغيل البرنامج، يجب أن نتحقق من أنه تم إنشاء ملف النص “test.txt” بنجاح وأنه يحتوي على النص المتوقع، والذي يجب أن يكون “123”.

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

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