我将简单的文本文件加载到内存中。我想从内存中读取就像我从像这样的光盘中读取一样:
ifstream file;
string line;
file.open("C:\\file.txt");
if(file.is_open())
{
while(file.good())
{
getline(file,line);
}
}
file.close();
但我有记忆中的档案。我在内存中有一个地址和这个文件的大小。
我必须做些什么才能获得与上述代码中处理文件相同的流畅度?
答案 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编译器(非常感谢。感谢您的回答,我找到了其他帮助我的答案!)。
似乎其他人也有类似的问题。我的确与here和here完全相同。
所以要从一块内存中读取就像形成一个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
}
希望这有帮助!