2010-06-06 2 views
10

Здравствуйте! Моя проблема может быть описана следующим образом:C++ - Реализация моего собственного потока

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

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

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

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

спасибо.

ответ

10

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

+0

и, IIRC, уже есть клей для вытягивать вещи из станд :: вектора или массива. – Thanatos

2

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

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

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

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