回答
你會定義一個streambuf
子包裹vector
,並通過這方面的一個實例的istream的構造。
如果數據在構建後沒有改變,則使用streambuf::setg()
設置數據指針就足夠了;對其他成員的默認實現做正確的事:
template<typename CharT, typename TraitsT = std::char_traits<CharT> >
class vectorwrapbuf : public std::basic_streambuf<CharT, TraitsT> {
public:
vectorwrapbuf(std::vector<CharT> &vec) {
setg(vec.data(), vec.data(), vec.data() + vec.size());
}
};
std::vector<char> data;
// ...
vectorwrapbuf<char> databuf(data)
std::istream is(&databuf);
如果你需要什麼比這更先進,覆蓋streambuf::underflow
方法。
謝謝。可以將醜陋的* vec.begin()替換爲vec.data()? – GabiMe 2012-01-11 07:10:18
當然,可以用'vec.data()+ vec.size()'替換'&* vec.end()'。 – 2012-01-11 07:21:12
注意:'std :: istream'不釋放指針。更好地在堆棧上創建流緩衝區。 – ybungalobill 2012-01-11 07:25:03
你會可以逃脫只需建立一個實現了>>操作如流類,像這樣:
template<class _ITy>
class RangeStreamLite
{
private:
_ITy Begin;
_ITy End;
_ITy Next;
public:
RangeStreamLite(_ITy begin, _ITy end) :
Begin(begin),
End(end),
Next(begin)
{
// Do nothing.
}
template<class _OTy>
RangeStreamLite& operator>>(_OTy& out)
{
out = *Next;
++Next;
return *this;
}
void reset()
{
Next = Begin;
}
};
這是一個「快速和骯髒的解決方案,一個「流精簡版',它並不是真正意義上的流,但它可以在你需要的只是一種表面流式的設備時起作用。要正確地創建一個自定義流會稍微複雜一些,並且需要從std :: streambuf繼承並實現必要的功能。這裏有幾個環節值得一看:
您將不得不編寫一個繼承自istream
的自定義流實現。這可以通過使用Boost.Iostreams
輕鬆完成 - 您只需執行簡單的Source即可。
Downvote是因爲間接/鏈接到解決方案而不是提供它們違反了Stack Overflow的概念。 – Catskul 2016-06-21 23:12:26
適應從Get an istream from a char*的答案,假設這是你想要做什麼:
// Forward declarations
std::vector<char> my_create_buffer();
void my_consume_buffer(std::istream & is);
// What you want to be able to write
std::vector<char> buffer = my_create_buffer();
my_consume_buffer(wrap_vector_as_istream(buffer));
然後,您可以創建wrap_vector_as_istream
這樣的(雖然未經測試):
#include <iostream>
#include <istream>
#include <streambuf>
#include <string>
struct wrap_vector_as_istream : std::streambuf
{
wrap_vector_as_istream(std::vector<char> & vec) {
this->setg(&vec[0], &vec[0], &vec[0]+vec.size());
}
};
一件事但要注意。您創建的對象包含指向矢量內存的指針。因此,如果您在將此包裝浮動的同時向矢量添加或刪除值,那麼您就要崩潰了。
(哦,如果你投了我,請投了我從適應了這個帖子。)使用Boost
:
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>
using namespace boost::iostreams;
basic_array_source<char> input_source(&my_vector[0], my_vector.size());
stream<basic_array_source<char> > input_stream(input_source);
或更簡單:
#include <boost/interprocess/streams/bufferstream.hpp>
using namespace boost::interprocess;
bufferstream input_stream(&my_vector[0], my_vector.size());
如果您交換vector<char>
可以,您可以使用Boost Interprocess' vectorstream
。例如:
#include <boost/interprocess/streams/vectorstream.hpp>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
static const char inp[] = "123 45 666";
vector<char> v(inp, inp + sizeof inp - 1);
using ivectorstream =
boost::interprocess::basic_ivectorstream<std::vector<char>>;
ivectorstream is;
is.swap_vector(v);
while (!is.eof()) {
int i = 0;
is >> i;
cout << i << '\n';
}
is.swap_vector(v);
cout << string(v.begin(), v.end()) << '\n';
return 0;
}
或者,如果您不能或不想發生變異的vector<char>
,您可以使用Boost Interprocess' bufferstream
。使用bufferstream
時,您不必將矢量切換到它。例如:
#include <boost/interprocess/streams/bufferstream.hpp>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
static const char inp[] = "123 45 666";
vector<char> v(inp, inp + sizeof inp - 1);
boost::interprocess::ibufferstream is(v.data(), v.size());
while (!is.eof()) {
int i = 0;
is >> i;
cout << i << '\n';
}
return 0;
}
- 1. IStream的C#IStream實現
- 2. C++的IStream,如果其他與載體
- 3. istream(ostream)與bool
- 4. C++簡單流操作與ostream和istream?
- 5. C++ istream的使用lex
- 6. EOF在C++中的IStream
- 7. C++的IStream ::讀取時
- 8. C++ istream的操作>>
- 9. istream的C++/CLI包裝器
- 10. istream和ostream問題 - C++
- 11. C文件*到ostream/istream
- 12. C++ istream提取精度?
- 13. 複合std :: istream在C++
- 14. istream運算符重載C++
- 15. C++,構造函數與衍生類的istream
- 16. C++:奇怪的行爲與std :: istream或哨兵環繞
- 17. 從輸入文件C++讀取與istream的操作符重載
- 18. C++ istream的自定義流緩衝區
- 19. 在C++中返回對istream的引用
- 20. 如何獲取IStream的長度? C++
- 21. 的IStream到矢量與結構轉換
- 22. 不能重載>>運算符與istream C++
- 23. PInvoke的和的IStream
- 24. istream不能在DEV C++中工作
- 25. 在C#中創建IStream對象
- 26. C++ Win32 IStream字符串問題
- 27. 將ifstream複製到istream C++ 14
- 28. C++ istream >>和ostream << errors
- 29. 在C++中聲明泛型istream
- 30. 在C++中創建istream和ostream對象
它不完全清楚你想要做什麼。你能舉一個你想寫的代碼的例子嗎? – 2012-01-11 06:45:29
我使用一個需要使用istream的庫。但我手邊只有一個矢量,因此我需要以某種方式包裝它 – GabiMe 2012-01-11 06:48:37
這是否足夠:http://stackoverflow.com/questions/4991697/wraps-a-vectorunsigned-char-inside-a-stream – 2012-01-11 06:53:34