سؤال

أحاول تنسيق الإخراج باستخدام مكتبة NTL (مكتبة نظرية الأعداد).أحد الكائنات هو كائن GF2X، وهو متعدد الحدود يتم تمثيله كسلسلة من المعاملات.مثال سريع:

GF2X a = GF2X(5,1);
a++;
cout<<a;

سوف تسفر [1 0 0 0 0 1] وهو نفس x^5 + 1.سؤالي يتعلق بتنسيق هذا الإخراج باستخدام setw.أريد أن أكون قادرًا على إخراج كائنات GF2X ذات أطوال مختلفة، مسبوقة برقم، وملحقة بسلسلة.أود أن يبدو الإخراج الخاص بي كما يلي:

  1:    [x x x x x x x x]       string here
 15:    [x x x]                 string here

سأوافق أيضًا على محاذاة اليمين ]، وهو ما يجب أن أتوقعه على الأرجح إذا كنت أستخدم setw.ومع ذلك، عندما أستخدم الكود (تم حذف أسماء المتغيرات من أجل البساطة):

    cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;

أحصل على إخراج مثل هذا (تمت إزالة بعض المساحة البيضاء من أجل الضغط)

  1:            [x x x x x x x x]   string here
 15:            [x x x]   string here

بمعنى آخر، يبدو أن الدالة setw تعالج مخرجات الملف بالكامل <<GF2X كحرف واحد، ولا يبدو أنه يمثل في الواقع حجم سلسلة الإخراج.كما ترون من المخرجات التي أوضحتها لكم، فإن الجانب الأيسر من مخرجات GF2X محاذي، ولكن الجانب الأيمن ليس كذلك، في حين يبدو عادةً أن setw يقوم بمحاذاة الجانب الأيمن من المخرجات.

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

المحلول

يمكنك القيام بذلك عن طريق تعديل عامل الإخراج.أتخيل أنه مكتوب بشيء من هذا القبيل (لا أعرف شيئًا عن فئة GF2X هذه، لذلك هذا رمز زائف جزئيًا:

std::ostream & operator<<(std::ostream & os, const GF2X & x)
{
    os << '[';
    for (int i=0; i<x.num_elements; ++i)
        os << x.get_element(i) << ' ';
    return os << ']';
}

المشكلة هي أن setw سيعمل فقط على "[" الأول، ولا يعمل على الكائن بأكمله (لا يعرف ما هو الكائن بأكمله).يمكنك إصلاح عامل التشغيل عن طريق كتابة كل شيء في سلسلة (باستخدام stringstream أو بعض الوسائل الأخرى)، و ثم إخراج السلسلة.إذا لم يكن تعديل العامل خيارًا متاحًا لك، فستحتاج إلى استخدام وظيفة مساعدة منفصلة لتحويل الكائن أولاً إلى سلسلة (باستخدام تدفق سلسلة)، ثم إخراج تلك السلسلة إلى الدفق.

في الحقيقة، boost::lexical_cast سيكون مفيدًا جدًا لك هنا، لأنه سيفي بالغرض بالنسبة لك:

cout << setw(35) << boost::lexical_cast<std::string>(GF2X);

نصائح أخرى

يمكنك استخدام كائن ostringstream مؤقت للاحتفاظ بالمخرجات، ثم استخدام setw على السلسلة المتوفرة (تم حذف أسماء المتغيرات).

    ostringstream oss;
    oss << GF2X;
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;

يؤدي هذا إلى تنسيق كائن ostream بأكمله، بدلاً من الحرف الأول فقط، ويعطي الإخراج المناسب.

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