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

时间:2010-12-04 14:09:51

标签: c++ visual-c++ memory memorystream streambuf

在我的previous问题中,我问过如何从内存中读取文件。因为我的整个文件都在内存中,所以我想同样阅读它。

我在问题中找到了answer,但实际上我需要将行读作wstring。有了文件,我可以这样做:

wifstream file;
wstring line2;

file.open("C:\\Users\\Mariusz\\Desktop\\zasoby.txt");
if(file.is_open())
{
    while(file.good())
    {
        getline(file,line2);
        wcout << line2 << endl;
    }
}   
file.close();

即使文件是ASCII格式。

现在我只是使用this回答中的函数将string行更改为wstring。但是,我认为如果有一种方法可以像wistream那样处理这块内存,那么将这些行作为wstring来获得更快的解决方案。我需要这个很快。

所以任何人都知道如何将这块内存视为wistream

3 个答案:

答案 0 :(得分:1)

您不能将ASCII字符串视为UNICODE字符串,因为它们包含的字符具有不同的大小。因此,您必须进行某种转换到临时缓冲区,然后使用该内存作为流的输入缓冲区。这就是你现在正在做的事情。

答案 1 :(得分:0)

很明显,如果你有stringistreamistringstream,那么你也有wstringwistream和{{1} }}

wistringstreamistringstream都只是char和wchar的模板类wistringstream的特化。

答案 2 :(得分:0)

我假设您的数据已经转换为所需的编码(请参阅@detunized answer)。

使用my answer to your previous question转换是直截了当的:

namespace io = boost::iostreams;

io::filtering_wistream in;
in.push(warray_source(array, arraySize));

如果你insist on not using boost,则转换如下(仍然是直接的):

class membuf : public wstreambuf // <- !!!HERE!!!
{
    public:
        membuf(wchar_t* p, size_t n) { // <- !!!HERE!!!
        setg(p, p, p + n);
    }
};

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

    wistream istr(&mb);
    wstring line;
    while(getline(istr, line))
    {
        wcout << L"line:[" << line << L"]" << endl;
    }
}

还要考虑this为何使用普通char UTF-8流。