Как я могу читать из памяти, как из файла, используя wistream?
В моем предыдущем вопросе я спросил, как читать из памяти так же, как из файла. Поскольку весь мой файл был в памяти, я хотел прочитать его аналогичным образом.
Я нашел ответ на мой вопрос, но на самом деле мне нужно читать строки как 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
s. И мне нужно, чтобы это было быстро.
Итак, кто-нибудь знает, как обрабатывать этот кусок памяти как wistream
?
Ответы
Ответ 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.
Ответ 2
Вы не можете обрабатывать строку ASCII как строку UNICODE, так как символы, которые они содержат, имеют разные размеры. Таким образом, вам нужно будет сделать какое-то преобразование во временный буфер, а затем использовать эту часть памяти в качестве входного буфера для вашего потока. Это то, что вы делаете прямо сейчас.
Ответ 3
Должно быть очевидно, что если у вас есть string
, istream
и istringstream
, значит, у вас также есть wstring
, wistream
и wistringstream
.
Оба istringstream
и wistringstream
являются только специализацией класса шаблона basic_istringstream
для char и wchar соответственно.