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

我发现 回答 出于我的问题,但实际上我需要将行读为 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中。

现在我只是在改变我的 string 线到 wstring 具有来自 这个 回答。但是,我认为如果有一种方法可以像 wistream 将此行作为一个更快的解决方案 wstrings。我需要快速。

因此,任何人都知道如何将这些记忆作为一个 wistream?

有帮助吗?

解决方案

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

使用 我对您以前问题的回答 转换很简单:

namespace io = boost::iostreams;

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

如果你 坚持不使用增压 然后转换如下(仍然直接):

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;
    }
}

也要考虑 这个 为什么使用普通 char UTF-8流。

其他提示

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

应该很明显的是,如果您有 string, istream, , 和 istringstream, ,因此您也有 wstring, wistream, , 和 wistringstream.

两个都 istringstreamwistringstream 只是模板类的专业化 basic_istringstream 分别用于char和wchar。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top