3

在我之前的问题中,我询问了如何从文件中读取内存。因为我的整个文件都在内存中,所以我想类似地阅读它。

我找到了问题的答案,但实际上我需要将行读为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行。但是,我认为如果有一种方法可以像处理这块内存一样,那么将这些行设置为s 将是一个更快的解决方案。我需要这个速度很快。wstringwistreamwstring

所以有人知道如何把这块内存当作wistream?

4

3 回答 3

1

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

于 2010-12-04T14:15:01.707 回答
1

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

使用我对您上一个问题的回答,转换是直截了当的:

namespace io = boost::iostreams;

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

如果您坚持不使用 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;
    }
}

还要考虑为什么要使用普通char的 UTF-8 流。

于 2010-12-10T09:55:30.047 回答
0

很明显,如果你有string,istreamistringstream, 那么你也有wstring,wistreamwistringstream.

两者istringstreamwistringstream只是basic_istringstream分别用于 char 和 wchar 的模板类的特化。

于 2010-12-04T14:27:11.230 回答