fork(1) download
  1. #include <iostream>
  2. #include <sstream>
  3.  
  4. namespace std
  5. {
  6. struct substreambuf : public streambuf
  7. {
  8. explicit substreambuf(streambuf* sbuf, streampos pos, streampos len) :
  9. m_sbuf(sbuf),
  10. m_pos(pos),
  11. m_len(len),
  12. m_read(0)
  13. {
  14. m_sbuf->pubseekpos(pos);
  15.  
  16. setbuf(nullptr, 0);
  17. }
  18.  
  19. protected:
  20. int underflow()
  21. {
  22. if (m_read >= m_len)
  23. {
  24. return traits_type::eof();
  25. }
  26.  
  27. return m_sbuf->sgetc();
  28. }
  29.  
  30. int uflow()
  31. {
  32. if (m_read >= m_len)
  33. {
  34. return traits_type::eof();
  35. }
  36.  
  37. m_read += 1;
  38.  
  39. return m_sbuf->sbumpc();
  40. }
  41.  
  42. streampos seekoff(streamoff off, ios_base::seekdir seekdir, ios_base::openmode openmode = ios_base::in | ios_base::out)
  43. {
  44. if (seekdir == ios_base::beg)
  45. {
  46. off += m_pos;
  47. }
  48. else if (seekdir == ios_base::cur)
  49. {
  50. off += m_pos + m_read;
  51. }
  52. else if (seekdir == ios_base::end)
  53. {
  54. off += m_pos + m_len;
  55. }
  56.  
  57. return m_sbuf->pubseekpos(off, openmode) - m_pos;
  58. }
  59.  
  60. streampos seekpos(streampos streampos, ios_base::openmode openmode = ios_base::in | ios_base::out)
  61. {
  62. streampos += m_pos;
  63.  
  64. if (streampos > m_pos + m_len)
  65. {
  66. return -1;
  67. }
  68.  
  69. return m_sbuf->pubseekpos(streampos, openmode) - m_pos;
  70. }
  71.  
  72. private:
  73. streambuf* m_sbuf;
  74. streampos m_pos;
  75. streamsize m_len;
  76. streampos m_read;
  77. };
  78. };
  79.  
  80. #include <iostream>
  81. #include <sstream>
  82.  
  83. using namespace std;
  84.  
  85. int main()
  86. {
  87. stringstream ss;
  88.  
  89. ss << "Hello, World!";
  90.  
  91. substreambuf asd(ss.rdbuf(), 0, 5);
  92.  
  93. istream istream(&asd);
  94.  
  95. char buffer[6] = { '\0' };
  96. istream.read(buffer, sizeof(buffer));
  97.  
  98. cout << buffer << endl;
  99. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Hello