在我的previous问题中,我问过如何从内存中读取文件。因为我的整个文件都在内存中,所以我想同样阅读它。
我在问题中找到了answer,但实际上我需要将行读作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格式。
现在我只是使用this回答中的函数将string
行更改为wstring
。但是,我认为如果有一种方法可以像wistream
那样处理这块内存,那么将这些行作为wstring
来获得更快的解决方案。我需要这个很快。
所以任何人都知道如何将这块内存视为wistream
?
答案 0 :(得分:1)
您不能将ASCII字符串视为UNICODE字符串,因为它们包含的字符具有不同的大小。因此,您必须进行某种转换到临时缓冲区,然后使用该内存作为流的输入缓冲区。这就是你现在正在做的事情。
答案 1 :(得分:0)
很明显,如果你有string
,istream
和istringstream
,那么你也有wstring
,wistream
和{{1} }}
wistringstream
和istringstream
都只是char和wchar的模板类wistringstream
的特化。
答案 2 :(得分:0)
我假设您的数据已经转换为所需的编码(请参阅@detunized answer)。
使用my answer to your previous question转换是直截了当的:
namespace io = boost::iostreams;
io::filtering_wistream in;
in.push(warray_source(array, arraySize));
如果你insist on not using 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;
}
}
还要考虑this为何使用普通char
UTF-8流。