我如何从内存中读取,就像使用iostream的文件一样?

时间:2010-12-03 14:01:54

标签: c++ memory iostream

我将简单的文本文件加载到内存中。我想从内存中读取就像我从像这样的光盘中读取一样:

ifstream file;
string line;

file.open("C:\\file.txt");
if(file.is_open())
{
    while(file.good())
    {
        getline(file,line);         
    }
}   
file.close();

但我有记忆中的档案。我在内存中有一个地址和这个文件的大小。

我必须做些什么才能获得与上述代码中处理文件相同的流畅度?

6 个答案:

答案 0 :(得分:11)

您可以执行以下操作..

std::istringstream str;
str.rdbuf()->pubsetbuf(<buffer>,<size of buffer>);

然后在getline来电中使用它

注意:getline不理解dos / unix的区别,所以\ r \ n包含在文本中,这就是我为什么选择它的原因!

  char buffer[] = "Hello World!\r\nThis is next line\r\nThe last line";  
  istringstream str;
  str.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
  string line;
  while(getline(str, line))
  {
    // chomp the \r as getline understands \n
    if (*line.rbegin() == '\r') line.erase(line.end() - 1);
    cout << "line:[" << line << "]" << endl;
  }

答案 1 :(得分:5)

您可以使用istringstream

string text = "text...";
istringstream file(text);
string line;

while(file.good())
{
    getline(file,line);         
}

答案 2 :(得分:4)

使用boost.Iostreams。具体来说是basic_array

namespace io = boost::iostreams;

io::filtering_istream in;
in.push(array_source(array, arraySize));
// use in

答案 3 :(得分:2)

我发现了一个适用于VC ++的解决方案,因为Nim解决方案仅适用于GCC编译器(非常感谢。感谢您的回答,我找到了其他帮助我的答案!)。

似乎其他人也有类似的问题。我的确与herehere完全相同。

所以要从一块内存中读取就像形成一个istream一样,你必须这样做:

class membuf : public streambuf
{
    public:
        membuf(char* p, size_t n) {
        setg(p, p, p + n);
    }
};

int main()
{
    char buffer[] = "Hello World!\nThis is next line\nThe last line";  
    membuf mb(buffer, sizeof(buffer));

    istream istr(&mb);
    string line;
    while(getline(istr, line))
    {
        cout << "line:[" << line << "]" << endl;
    }
}

编辑:如果您有'\ r \ n'新行,就像Nim写道:

if (*line.rbegin() == '\r') line.erase(line.end() - 1);

我正在尝试将此内存视为wistream。有人知道怎么做这个吗?我单独询问了question

答案 4 :(得分:1)

使用

std::stringstream

它有一个操作和读取字符串的接口,就像其他流一样。

答案 5 :(得分:1)

我将如何做到这一点:

#include <sstream>

std::istringstream stream("some textual value");
std::string line;
while (std::getline(stream, line)) {
    // do something with line
}

希望这有帮助!