سؤال

لبعض الأسباب أحتاج إلى مؤشر ملف (ملف*) يشير إلى لا شيء.وهذا يعني أنني يمكن تمريرها إلى وظيفة فبرينتف و فبرينتف تجاهل مؤشر الملف.

على سبيل المثال:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

هل هناك مؤشر ملف (ملف*) يشير إلى لا شيء?

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

المحلول

لا.

سوف التعليمات البرمجية الخاصة بك يسبب استثناء وقت التشغيل.يمكنك استخدام /dev/null على سبيل المثال ، إذا كنت تعمل على نظام تشغيل يدعمه ، ولكن لا يوجد شيء من هذا القبيل المدمج في سي++.

نصائح أخرى

لحل مشكلتك الفعلية (المذكورة في التعليقات)، استخدم snprintf بدلاً من printf, ، بشرط أن يكون متاحًا في تطبيق C++ الخاص بك (وهو أمر غير مضمون في C++ 03).قم بتمرير مؤشر فارغ للمخزن المؤقت و0 للحجم.لم تتم كتابة أي شيء، لكن القيمة المرجعة هي طول السلسلة المنسقة (باستثناء فاصل null).

[يحرر:عفوا، لقد نسيت ذلك snprintf على نظام التشغيل Windows لا يتوافق مع C99.تقوم بإرجاع خطأ في حالة حدوث الاقتطاع، وليس الطول المطلوب.لا أعرف ما الذي سيفعلونه بشأن حقيقة أن C++0x يتطلب التوافق مع C99 snprintf.]

للإجابة على سؤالك، يمكنك فتح /dev/null على أنظمة تشبه UNIX أو nul على ويندوز.يكتب إلى النتيجة FILE* ليس لها أي تأثير.ومع ذلك، لا يوجد جهاز محمول فارغ.

لماذا لا تغلب طريقة FPRINTF Call مع بيان GransoSodicetagCode؟

على الرغم من أنه كما قال NirMH، يمكنك تضمينه if (nothing != NULL), ، هناك طريقة أخرى.يمكنك فتح ملف في وضع القراءة (باستخدام "r") وعندما ترسله إلى fprintf, ، يتم تجاهل الكتابة (تحرير:كما تمت مناقشته في التعليقات، تذكر أن تحدد n=0 إذا كانت سلبية كما عاد بها fprintf).

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

إذا كنت لا تهتم إذا كان الكود الخاص بك يعتمد على النظام، فيمكنك استخدامه /dev/null في لينكس، nul في النوافذ وغيرها،

أنت ترتكب خطأ في التصميم

من الواضح أن ما تريد معرفته هو عدد الأحرف اللازمة لكتابة رقمك.

أنت تستخدم _ * printf_ لذلك ، وهي فكرة جيدة. أنت فقط تريد حساب عدد الأحرف "المكتوبة" ، وبالتالي هناك حاجة. لكنك لا تريد عرض أي شيء ، لذلك قمت بوخز fprintf بدلاً من printf فقط. لكن fprintf لا يعمل بدون FILE للكتابة فيه ...

كما قال ستيف ، يجب أن تستخدم snprintf () ، الذي يكتب في سلسلة في الذاكرة.

كما يقول ستيف ، يجب أن يعمل snprintf المزود بسلسلة NULL على النحو المنشود باستثناء Windows. ثم على النوافذ ، قم فقط بتزويدها بسلسلة مؤقتة ستتجاهلها بعد ذلك. Genacodicetagpre

ثم تتصل فقط بـ: Genacodicetagpre

(يمكن تحسين هذه الوظيفة لحساب الحجم المطلوب لعرض أي شيء ولكني أفضل إبقائه بسيطًا في الوقت الحالي.)

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