如何像使用Wistream的文件一样从内存中读取?
-
08-10-2019 - |
题
在我的 以前的 问题我问了如何像从文件一样从内存中读取。因为我的整个文件都在内存中,所以我想同样阅读它。
我发现 回答 出于我的问题,但实际上我需要将行读为 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
?
解决方案
我假设您的数据已经转换为所需的编码(请参阅@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
.
两个都 istringstream
和 wistringstream
只是模板类的专业化 basic_istringstream
分别用于char和wchar。
不隶属于 StackOverflow