Как я могу читать из памяти так же, как из файла, используя wistream? - PullRequest
2 голосов
/ 04 декабря 2010

В моем предыдущем вопросе я спросил, как читать из памяти так же, как из файла.Поскольку весь мой файл находился в памяти, я хотел прочитать его аналогичным образом.

Я нашел ответ на мой вопрос, но на самом деле мне нужно прочитать строки как 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, было бы более быстрое решение получить эти строки как wstring с.И мне нужно, чтобы это было быстро.

Так что кто-нибудь знает, как трактовать этот кусок памяти как wistream?

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

Вы не можете рассматривать строку ASCII как строку UNICODE, так как символы, которые они содержат, имеют разные размеры. Таким образом, вам придется выполнить какое-то преобразование во временный буфер, а затем использовать этот фрагмент памяти в качестве входного буфера для вашего потока. Это то, что вы делаете прямо сейчас.

0 голосов
/ 10 декабря 2010

Я предполагаю, что ваши данные уже преобразованы в нужную кодировку (см. @Detunized answer).

Используя мой ответ на ваш предыдущий вопрос преобразование просто:

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 потоки.

0 голосов
/ 04 декабря 2010

Должно быть очевидно, что если у вас есть string, istream и istringstream, следовательно, у вас также есть wstring, wistream и wistringstream.

Оба istringstream и wistringstream являются просто специализацией шаблона класса basic_istringstream для char и wchar соответственно.

...