istream变量可以是类变量吗?

时间:2014-11-04 09:13:24

标签: c++ visual-studio-2010 iostream

使用VS2010在C ++中开发程序时,我可以定义

std::istream streamRead(ReadBuf&); // struct ReadBuf : public std::streambuf declared before

并在我的程序中的多个函数中使用此streamRead

如果没有,任何人都可以建议我如何使用getline阅读流。我必须从不同的函数中读取相同的流。

提前谢谢。

编辑:

我的头文件中声明的结构如下:

struct ReadBuf : public std::streambuf
{
    ReadBuf(PBYTE s,size_t n)
    {
        setg((char*)s,(char*) s,( char*)s + n);
    }
};

我在内存中有一个缓冲区,我程序的输入是它的指针和大小。使用上述结构,我将其复制到streambuffer。现在我必须逐行阅读这个streambuffer。这是我的要求。

例如我的一些功能是:

int GetSessionN(int session_id,SessionDetail &N_session);

int GetInstanceId(string header,SessionDetail &N_session);

int GetDriverDetails(string body_data,SessionDetail &N_session);    

我必须使用n读取流中的第一个GetSessionN行,然后使用下一个函数中的连续n行,依此类推。

这是我初始化ReadBuf的对象的地方。我无法在全球范围内初始化它。

int SetupLogReader::ProcessLogFile(PBYTE &mem_ptr, ULONG &size)
{
   string read;

   ReadBuf buf(mem_ptr, size);

   istream streamRead(&buf);// Not able use StreamRead declared in header here.
}

1 个答案:

答案 0 :(得分:2)

你不应该在函数中返回它时复制流,但是引用它,即:

std::istream &streamRead(ReadBuf&){
  if (_stream == null){
    // create stream
    _stream = [newly created stream];
  }
  return _stream;
}

编辑:

你也可以使用std :: istringstream,因为它已经提供了你正在寻找的功能:

来自istringstream manual

std::string stringvalues = "line1\nline2";
std::istringstream iss (stringvalues);
for (int n=0; n<2; n++)
{
    char val[256];
    iss.getline(val, 256);
    std::cout << val << '\n';
}