قراءة مباشرة من الأمراض المنقولة جنسيا :: istream إلى الأمراض المنقولة جنسيا :: سلسلة

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

  •  08-07-2019
  •  | 
  •  

سؤال

وهناك على أية حال لقراءة العدد المعروف من وحدات البايت، مباشرة إلى الأمراض المنقولة جنسيا :: سلسلة، دون خلق منطقة عازلة مؤقتة للقيام بذلك؟

وعلى سبيل المثال حاليا يمكنني القيام به من قبل

boost::uint16_t len;
is.read((char*)&len, 2);
char *tmpStr = new char[len];
is.read(tmpStr, len);
std::string str(tmpStr, len);
delete[] tmpStr;
هل كانت مفيدة؟

المحلول

وstd::string لديه وظيفة resize هل يمكن استخدام، أو منشئ التي سوف تفعل الشيء نفسه:

boost::uint16_t len;
is.read((char*)&len, 2);

std::string str(len, '\0');
is.read(&str[0], len);

وهذا هو لم تختبر، وأنا لا أعرف إذا تم تكليف السلاسل لتخزين متجاورة.

نصائح أخرى

هل يمكن استخدام مزيج من copy_n وinsert_iterator

void test_1816319()
{
    static char const* fname = "test_1816319.bin";
    std::ofstream ofs(fname, std::ios::binary);
    ofs.write("\x2\x0", 2);
    ofs.write("ab", 2);
    ofs.close();

    std::ifstream ifs(fname, std::ios::binary);
    std::string s;
    size_t n = 0;
    ifs.read((char*)&n, 2);
    std::istream_iterator<char> isi(ifs), isiend;
    std::copy_n(isi, n, std::insert_iterator<std::string>(s, s.begin()));
    ifs.close();
    _unlink(fname);

    std::cout << s << std::endl;
}

ولا النسخ، لا الخارقة، لا إمكانية التجاوز، أي سلوك غير معرف.

هل يمكن استخدام شيء من هذا القبيل getline:

#include <iostream>
#include <string>
using namespace std;

int main () {
  string str;
  getline (cin,str,' ');
}

وأود أن استخدام ناقلات باعتبارها منطقة عازلة.

boost::uint16_t len;
is.read((char*)&len, 2); // Note if this file was saved from a different architecture 
                         // then endianness of these two bytes may be reversed.

std::vector buffer(len);  // uninitialized.
is.read(&buffer[0], len);

std::string  str(buffer.begin(),buffer.end());

وعلى الرغم من أنك سوف تحصل على الأرجح بعيدا باستخدام سلسلة ك المخزن المؤقت (كما وصفها جي-مان). أنها ليست مضمونة وفق المعايير أن أعضاء السلاسل في مواقع متتالية (حتى تحقق تنفيذ الحالي ووضع تعليق الكبيرة التي يحتاجها فحص عند ترقية إلى آخر مترجم / منصة).

هل مجرد تحسين طول الرمز أو محاولة لإنقاذ نفسك نسخة هنا؟ ما هو الخطأ مع مخزن مؤقت؟

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

وتحرير: ممارسة أكثر تبحث ... تهيئة الأمراض المنقولة جنسيا :: سلسلة من تشار * بدون نسخة

في الجواب الثاني، هو ورد فيه جدا بشكل قاطع أنه لا يمكنك تحقيق ما كنت تبحث لتحقيق (أي تعبئة الأمراض المنقولة جنسيا :: سلسلة دون التكرار على شار * لنسخ).

ونلقي نظرة على روتين تحميل الخاص (وظيفة هنا ربما؟) وتقليل المخصصات: جديد وحذف بالتأكيد لا تخلو حتى تتمكن من توفير ما لا يقل عن بعض الوقت إذا لم يكن لديك لإعادة إنشاء المخزن المؤقت باستمرار . أجد دائما محو مفيدة من قبل memset'ing المخزن المؤقت إلى 0 أو باطل إنهاء مؤشر الأول للصفيف كل التكرار ولكن قد القضاء بسرعة هذا الرمز في مصلحة الأداء مرة واحدة كنت واثقا في الخوارزمية الخاصة بك.

وطريقة سهلة ستكون كما يلي:

std::istream& data
const size_t dataSize(static_cast<size_t>(data.rdbuf()->in_avail()));
std::string content;
content.reserve( dataSize);
data.read(&content[0], dataSize);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top