Search code examples
c++istream

istream object don't read any char


Why istream object after calling readsome() method don't give any chars in buffer? Is there any error in class construction?

StreamBuffer.h

#ifndef StreamBuffer_h
#define StreamBuffer_h

#include <string>
#include <fstream>
#include <iostream>
#include <iterator>

enum StreamBufferState
{
  STREAMBUFFER_OK = 0,
  STREAMBUFFER_EOF = 1
};

class StreamBuffer
{
    std::fstream file;
    std::istream istrm;
    int maxBufferSize;
    std::string buffer;
 public:
    StreamBuffer(int maxBuffSize, const std::string& filename);
    ~StreamBuffer();
    void SetMaxBufferSize(unsigned int maxBuffSize);
  StreamBufferState FullBufferWithData();
    std::string GetDataBuffer();
};

#endif

StreamBuffer.cpp

#include "StreamBuffer.h"

using namespace std;

StreamBuffer::StreamBuffer(int maxBuffSize, const std::string& filename) : istrm( !filename.empty() ? file.rdbuf() : cin.rdbuf() )
{
  SetMaxBufferSize(maxBuffSize);
    if(!filename.empty())
    {
        file.open(filename.c_str(),ios::in | ios::binary);
    }
    else
    {
        std::cin>>noskipws;
    }
}

StreamBuffer::~StreamBuffer()
{
    file.close();
}

void StreamBuffer::SetMaxBufferSize(unsigned int maxBuffSize)
{
  maxBufferSize = maxBuffSize;
}

StreamBufferState StreamBuffer::FullBufferWithData()
{
    istrm.readsome((char*)&buffer[0],maxBufferSize);
    if(istrm.eof())
        return STREAMBUFFER_EOF;
    return STREAMBUFFER_OK;
}

std::string StreamBuffer::GetDataBuffer()
{
    string buf = buffer;
  return buf;
}

File is opened, but readsome() don't read buffer.


Solution

  • You have undefined behavior in your code, as you try read into an empty string. You need to set the size of buffer.


    An unrelated logical error: In the FullBufferWithData function you will return "OK" even if there is an error reading the file.