تهيئة C ++ STD :: istringStream من المخزن المؤقت في الذاكرة؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

لدي كتلة ذاكرة (Opaque)، وأريد تخزينها في Blob في MySQL من خلال محول C ++ الخاص بهم. يتوقع المحول ISTream:

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;

لذلك سؤالي هو: كيف يمكنني إنشاء STD :: ISTream من كتلة الذاكرة هذه (مكتوب ك Char *). إنها ليست سلسلة لأنها ليست قد تم إنهاؤها (لكنني أعرف طولها بالطبع).

لم أستطع إيجاد طريقة للقيام بذلك دون نسخ كتلة الذاكرة الخاصة بي على سبيل المثال في سلسلة STD :: أعتقد أن هذا مضيع قليلا. شيء من هذا القبيل لا يعمل:

    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);

لأن STD :: Streambuf لا يحتوي على مثل هذا المنشئ. رأيت الاقتراح التالي.

    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);

هل هذه الطريقة الصحيحة؟

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

المحلول

انظر إلى الأمراض المنقولة جنسيا :: IStrstream لديه منشئ

 istrstream( char* pch, int nLength );

هذه الفئة هي نوع من انخفاض قيمة أو على الأقل، كما أخبرت عادة استخدام الطبقات الأخرى.
المشكلة مع Strstream هي أنها أكثر تعقيدا لإدارة ذاكرة Char * المخزن المؤقت بشكل عام، لذا تفضل أنك تفضل Stringstream أثناء إدارة الذاكرة لك. ومع ذلك، في هذه الحالة، تقوم بالفعل بإدارة ذاكرة Char * وبالتالي فإن الفائدة العادية في هذه الحالة تكلفة. في الواقع، في هذه الحالة، يفعل Strstream بالضبط ما تريد مع الحد الأدنى من النفقات العامة في التعليمات البرمجية أو السرعة. هذا مشابه لمناقشة ostrsteram بواسطة عشب سوتر

نصائح أخرى

انها فعلا تافهة جميلة لكتابة طلقة واحدة std::streambuf يستخدم المخزن المؤقت في مكانه كسلوك افتراضي لجميع الوظائف الافتراضية لل std::streambuf هل "الشيء الصحيح". يمكنك فقط setg منطقة القراءة في البناء و underflow و uflow يمكن أن تترك بأمان للعودة traits_type::eof() كما نهاية منطقة الحصول الأولي هي نهاية الدفق.

على سبيل المثال:

#include <streambuf>
#include <iostream>
#include <istream>
#include <ostream>

struct OneShotReadBuf : public std::streambuf
{
    OneShotReadBuf(char* s, std::size_t n)
    {
        setg(s, s, s + n);
    }
};

char hw[] = "Hello, World!\n";

int main()
{
    // In this case disregard the null terminator
    OneShotReadBuf osrb(hw, sizeof hw - 1);
    std::istream istr(&osrb);

    istr >> std::cout.rdbuf();
}

يحتوي Bost.iostreams على دفق يعمل مثل Stringstream، ولكن يلتف صفيفا أصلية، لذلك يمكنك تجنب الاضطرار إلى نسخ البيانات.

STD :: Stringstream تنشئ دائما العازلة الداخلية الخاصة بها

غير مختبر ولكن ربما يستحق الاختبار ...

std::stringstream ss;
ss.write( blockPtr, blockLength );
ss.seekg(0);

ثم استدعاء وظيفة setblob مع SS. لديك لا يزال لديك هذا المخزن المؤقت الداخلي في STD :: Stringstream كما ذكر JALF بالفعل.

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