وظيفة تشبه "fprintf" لواصفات الملفات (أيint fd بدلاً من FILE* fp)

StackOverflow https://stackoverflow.com/questions/4246588

  •  27-09-2019
  •  | 
  •  

سؤال

ربما أفتقدها، ولكن أليس هناك وظيفة مكافئة لـ fprintf لواصفات الملفات، أو حتى طريقة للتبديل بينها مؤقتًا؟

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

المحلول

هل يمكن أن ننظر في dprintf (امتدادات GNU، وليس في C أو POSIX) :

تعد وظائف DPRINTF () و VDPRINTF () (كما هو موجود في مكتبة GLIBC2) نظائرها الدقيقة لـ FPRINTF () و VFPRINTF () ، باستثناء أنهما يخرجون إلى واصف ملف FD ​​بدلاً من دفق معين.

يحرر كما أشار العديد منكم في التعليقات، قام POSIX 2008 بتوحيد هذه الوظائف.

نصائح أخرى

لا يوجد C أو Posix (تحرير: قبل عام 2008) الوظيفة القياسية للقيام بها printf على واصف الملف ، ولكن يمكنك "فتح" واصف ملف كملف FILE * مع Posix-Standard fdopen(int desc, const char *mode). لست متأكدًا من مدى دعم التقليب مرة أخرى لاستخدام الواصف مباشرة ، لكنني أعتقد أنه قد يعمل إذا قمت بتطهير المخزن المؤقت أولاً ...

بالطبع يمكنك فقط تنفيذ ما لديك باستخدام شيء مثل vsprintf, ، ولكن من الواضح أنه عليك بعد ذلك الاعتناء بالتخزين المؤقت.

لما يستحق ذلك منذ ذلك الحين dprintf ليست وظيفة posix ، يمكن للمرء استخدام ما يلي إذا كانت قابلية النقل مشكلة:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>

int
fdprintf ( int fd, size_t bufmax, const char * fmt, ... )
{
  char * buffer;
  int n;
  va_list ap;

  buffer = ( char * ) malloc ( bufmax );
  if ( !buffer )
    return 0;

  va_start ( ap, fmt );
  n = vsnprintf ( buffer, bufmax, fmt, ap );
  va_end ( ap );

  write ( fd, buffer, n );
  free ( buffer );
  return n;
}

على الأرجح يريد التحقق من قيمة الإرجاع write, ، ولكنك استوعبت الفكرة العامة. من الواضح أن هذا لا يعزز مثل FILE * الروتين كنت أبحث أكثر عن مواصفات التنسيق والقدرة على إنشاء بيانات الأحرف التي سيتم كتابتها إلى واصف الملف ، بدلاً من القلق بشأن تخزين البيانات أثناء كتابتها.

لا ، ليس هناك قياسي ، لكن الاثنين يفعلان أشياء مختلفة. تقوم FPRINFT ، كجزء من STDIO ، بأشياء مثل Buffer التي تقرأها وتكتبها ، تدعم UNGETC وما إلى ذلك باستخدام FD يتجاوز كل ذلك ويدعو نظام التشغيل مباشرةً.

لذلك فهي ليست قابلة للتبديل. الوجه يتخبط بينهما من شأنه أن يفسد stdio التخزين المؤقت إذا لم يكن هناك شيء آخر

يمكنك فتح واصف الملف كملف عادي يمكن معالجته بواسطة fprintf() مع fdopen.

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