【问题标题】:How can I read from memory just like from a file using wistream?如何从内存中读取,就像使用 wistream 从文件中读取一样?
【发布时间】:2010-12-04 14:09:50
【问题描述】:

在我的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 格式。

现在我只是将我的string 行更改为wstring,并使用来自this 答案的函数。但是,我认为如果有一种方法可以像处理wistream 一样处理这块内存,那么将这些行设置为wstrings 将是一个更快的解决方案。我需要这个速度很快。

所以有人知道如何将这块内存视为wistream

【问题讨论】:

    标签: c++ visual-c++ memory memorystream streambuf


    【解决方案1】:

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

    使用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 流。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但我可以在 ASCII 文件上使用 wifstream 并在 wstring 中加载行。我会说这是“即时”的转换。我的意思是我可以使用 ifstream 读取 ASCII 文件,然后将字符串转换为 wstrings,但我想简单地使用 wifstream 会更快更容易。
      • wifstream 在后台使用codecvt 进行转换。 stringstream 似乎不知道该怎么做。它即时为您完成并不意味着它更快。它以每个字符为基础进行处理,并且可能涉及一些开销。批量转换所有内容应该更快。
      • 关于性能的一个注释。别猜了。如果您认为它可能会更慢,请对其进行分析。差异可能可以忽略不计,不值得花所有时间来找出最完美的解决方案。首先解决有效的方法,然后解决导致问题的原因。
      【解决方案3】:

      很明显,如果你有stringistreamistringstream,那么你也有wstringwistreamwistringstream

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多