C ++ - Реализация моего собственного потока - PullRequest
10 голосов
/ 07 июня 2010

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

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

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

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

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

Спасибо.

Ответы [ 3 ]

10 голосов
/ 07 июня 2010

Если вы хотите создать собственный поток, я бы посмотрел на библиотеку Boost.Iostreams . Это позволяет легко создавать собственные потоковые объекты.

5 голосов
/ 24 ноября 2011

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

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

2 голосов
/ 07 июня 2010

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

#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;
}
...