سؤال

واني اسعى الى خلق ج ++ ostream لأسباب تربوية. اختباري سيتم إنشاء وostream أن يتصرف مثل ofstream أن استثناء بدلا من الكتابة إلى ملف انها ستلغى إلى حاوية صف مزدوج الذيل أو الموجه.

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

المحلول

وكما هو الحال في مجال التعليم، كما تقول، وسوف تظهر لك كيف لي أن تفعل مثل هذا ثينغي. خلاف ذلك، stringstream هو حقا وسيلة للذهاب.

ويبدو أنك تريد إنشاء تنفيذ streambuf أن يكتب ثم إلى ناقلات / صف مزدوج الذيل. شيء من هذا القبيل (نسخ من إجابة أخرى لي أن rel="noreferrer"> ):

template<typename Ch, typename Traits = std::char_traits<Ch>,
         typename Sequence = std::vector<Ch> >
struct basic_seqbuf : std::basic_streambuf<Ch, Traits> {
     typedef std::basic_streambuf<Ch, Traits> base_type;
     typedef typename base_type::int_type int_type;
     typedef typename base_type::traits_type traits_type;

     virtual int_type overflow(int_type ch) {
         if(traits_type::eq_int_type(ch, traits_type::eof()))
             return traits_type::eof();
         c.push_back(traits_type::to_char_type(ch));
         return ch;
     }

    Sequence const& get_sequence() const {
        return c;
    }
protected:
    Sequence c;
};

// convenient typedefs
typedef basic_seqbuf<char> seqbuf;
typedef basic_seqbuf<wchar_t> wseqbuf;

ويمكنك استخدامه مثل هذا:

seqbuf s;
std::ostream os(&s);
os << "hello, i'm " << 22 << " years old" << std::endl;
std::vector<char> v = s.get_sequence();

إذا كنت تريد أن يكون لها صف مزدوج الذيل كما تسلسل، يمكنك القيام بذلك:

typedef basic_seqbuf< char, char_traits<char>, std::deque<char> > dseq_buf;

وأو شيئا من هذا القبيل ... حسنا أنا لم نجرب ذلك. ولكن ربما لهذا أيضا شيء جيد - حتى إذا كان يحتوي يزال البق، يمكنك محاولة إصلاحها.

نصائح أخرى

استخدم الأمراض المنقولة جنسيا :: stringstream

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream   s;
    s << "Plop" << 5;

    std::cout << s.str();
}

وأنا ملاحظه فقط أن لم يكن لديك لكتابة فئة مثل ostream لذلك. يمكنك استخدام محول لتحقيق هدفك.

وعلى سبيل المثال، هذا الرمز يقرأ من istream وإدراج كل عنصر في ناقلات:

vector<string> V;
copy(istream_iterator<string>(cin), 
     istream_iterator<string>(), 
     back_inserter(V)); 

ودون مزيد من التفاصيل حول ما تريد القيام به من الصعب أن تكون محددة جدا، ولكن كنت لا تريد إنشاء ostream الجديد. ما تريد القيام به هو خلق نوع streambuf جديد، واستخدام ostream موجود.

والشيء easyist القيام به هو أن ترث من الأمراض المنقولة جنسيا :: basic_filebuf <>، وتفرط في تزامن () والفائض () طرق لإضافة عناصر إلى هياكل البيانات الخاصة بك.

scroll top