আপনার যদি কোডটি থাকে তবে log_out()
এটি আবার লিখুন। সম্ভবত, আপনি এটি করতে পারেন:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
অতিরিক্ত লগিংয়ের তথ্য যদি প্রয়োজন হয় তবে তা বার্তাটি দেখানোর আগে বা পরে মুদ্রণ করা যেতে পারে। এটি মেমরি বরাদ্দ এবং সন্দেহজনক বাফার আকার এবং আরও অনেক কিছু সংরক্ষণ করে। আপনার সম্ভবত logfp
শূন্যের (নাল পয়েন্টার) আরম্ভ করতে হবে এবং এটি নাল কিনা তা যাচাই করা উচিত এবং যথাযথ হিসাবে লগ ফাইলটি খুলুন - তবে বিদ্যমান কোডটি log_out()
যেভাবেই হোক না কেন এটির সাথে আচরণ করা উচিত।
এই সমাধানটির সুবিধাটি হ'ল আপনি কেবল এটিকে কল করতে পারেন যেন এটির কোনও রূপ printf()
; আসলে এটি একটি ছোটখাটো রূপ printf()
।
যদি আপনার কাছে কোডটি না থাকে তবে log_out()
আপনি এটি উপরে বর্ণিত একটি যেমন বৈকল্পিক দিয়ে প্রতিস্থাপন করতে পারেন কিনা তা বিবেচনা করুন। আপনি একই নামটি ব্যবহার করতে পারবেন কিনা তা আপনার অ্যাপ্লিকেশন কাঠামো এবং বর্তমান log_out()
ফাংশনের চূড়ান্ত উত্সের উপর নির্ভর করবে । এটি যদি অন্য অপরিহার্য ফাংশন হিসাবে একই অবজেক্ট ফাইলে থাকে তবে আপনাকে একটি নতুন নাম ব্যবহার করতে হবে। আপনি কীভাবে এটির সঠিক প্রতিলিপি তৈরি করতে সক্ষম না করতে পারেন, আপনাকে অন্যান্য উত্তরে দেওয়া মত কিছু বৈকল্পিক ব্যবহার করতে হবে যা যথাযথ পরিমাণের মেমরি বরাদ্দ করে।
void log_out_wrapper(const char *fmt, ...)
{
va_list args;
size_t len;
char *space;
va_start(args, fmt);
len = vsnprintf(0, 0, fmt, args);
va_end(args);
if ((space = malloc(len + 1)) != 0)
{
va_start(args, fmt);
vsnprintf(space, len+1, fmt, args);
va_end(args);
log_out(space);
free(space);
}
}
স্পষ্টতই, আপনি এখন এর log_out_wrapper()
পরিবর্তে কল করুন log_out()
- তবে মেমরির বরাদ্দ এবং আরও একবার একবার হয়ে গেছে। আমি একটি অপ্রয়োজনীয় বাইট দ্বারা অতিরিক্ত বরাদ্দ পাওয়ার অধিকার সংরক্ষণ করি - আমি যে দৈর্ঘ্যটি ফিরিয়ে দিয়েছি vsnprintf()
তাতে সমাপ্ত নাল অন্তর্ভুক্ত কিনা তা আমি ডাবল-চেক করে দেখিনি ।