Подтвердить что ты не робот

С++ - реализация моего собственного потока

Здравствуйте! Моя проблема может быть описана следующим образом:

У меня есть некоторые данные, которые на самом деле являются массивом и могут быть представлены как char* data с некоторыми size

У меня также есть некоторый унаследованный код (функция), который принимает некоторый абстрактный объект std::istream как параметр и использует этот поток для извлечения данных для работы.

Итак, мой вопрос следующий: какой бы простой способ сопоставить мой data с некоторым объектом std::istream, чтобы я мог передать его моей функции? Я думал о создании объекта std::stringstream из моего data, но это означает, что копирование и (как я полагаю) не лучшее решение.

Любые идеи, как это можно сделать, чтобы my std::istream работал с data напрямую?

Спасибо.

4b9b3361

Ответ 1

Если вы смотрите на создание собственного потока, я бы посмотрел библиотеку

Ответ 2

Определенно, это не самый простой способ, но на всякий случай кто-то хочет понять, как работают std-потоки внутри, это, по-видимому, очень хорошее представление о том, как вы можете качать самостоятельно:

http://www.mr-edd.co.uk/blog/beginners_guide_streambuf

Ответ 3

Использовать поток строк:

#include <sstream>

int main()
{
    char[]  data = "PLOP PLOP PLOP";
    int     size = 13;  // PS I know this is not the same as strlen(data);

    std::stringstream  stream(std::string(data, size));

    // use stream as an istream;
}

Если вы хотите быть реальным эффективным, вы можете напрямую использовать буфер потока. Я не пробовал это и не имею компилятора для тестирования, но следующее должно работать:

#include <sstream>

int main()
{
    char[]  data = "PLOP PLOP PLOP";
    int     size = 13;  // PS I know this is not the same as strlen(data);

    std::stringstream  stream;
    stream.rdbuf()->pubsetbuf(data, size);

    // use stream as an istream;
}