Truncate C ++ سلسلة الحقول التي تم إنشاؤها بواسطة OstringStream ، iomanip: setw

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

سؤال

في C ++ ، أحتاج إلى تمثيلات سلسلة من الأعداد الصحيحة مع الأصفار الرائدة ، حيث يحتوي التمثيل على 8 أرقام ولا يزيد عن 8 أرقام ، مما يؤدي إلى اقتطاع على الجانب الأيمن إذا لزم الأمر. اعتقدت أنه يمكنني القيام بذلك باستخدام OstringStream و iomanip.setw () فقط ، مثل هذا:

int num_1 = 3000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_1;
cout << "field: " << out_target.str() << " vs input: " << num_1 << endl;

الإخراج هنا هو:

field: 00003000 vs input: 3000

لطيف جدًا! ومع ذلك ، إذا جربت رقمًا أكبر ، فإن Setw يتيح للإخراج أن ينمو إلى ما يتجاوز 8 أحرف:

int num_2 = 2000000000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_2;
cout << "field: " << out_target.str() << " vs input: " << num_2 << endl;
out_target.str("");

انتاج:

field: 2000000000 vs input: 2000000000

الإخراج المطلوب هو "20000000". لا يوجد شيء يمنعني من استخدام عملية ثانية لأخذ الأحرف الثمانية الأولى فقط ، ولكن هل الاقتطاع الميداني مفقود حقًا من Iomanip؟ هل سيفعل تنسيق الدعم ما أحتاجه في خطوة واحدة؟

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

المحلول

لا أستطيع التفكير في أي طريقة لاقتطاع حقل رقمي من هذا القبيل. ربما لم يتم تنفيذه لأنه سيغير القيمة.

ostream::write() يتيح لك اقتطاع أ سلسلة المخزن المؤقت ببساطة بما فيه الكفاية ، كما في هذا المثال ...

    int num_2 = 2000000000;
    ostringstream out_target;

    out_target << setw(8) << setfill('0') << num_2;
    cout << "field: ";
    cout.write(out_target.str().c_str(), 8);
    cout << " vs input: " << num_2 << endl;

نصائح أخرى

إذا افترضت أن snprintf () سوف يكتب أكبر عدد ممكن من chars (لا أعتقد أن هذا مضمون) ،

char buf[9];
snprintf(buf, 10, "%08d", num);
buf[8] = 0;
cout << std::string(buf) << endl;

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

if (snprintf(buf, 10, "%08d", num) > 8) {
    throw std::exception("oops")
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top