【问题标题】:Output wstringstream by blocks issue按块输出 wstringstream 问题
【发布时间】:2020-10-09 15:58:44
【问题描述】:

我在读取 wstringstream 数据时遇到了一些问题。像这样的代码:

#include <iostream>
#include <sstream>

int main(int argc, char* argv[]) {
    std::wstringstream buf(L"dsadsadsad dsadsadsad sadsadsadsad sa dsadsadsads dasdsadsa");
    wchar_t sendbuf[5];
    wmemset(sendbuf, 0, 5);

    while (buf.read(sendbuf, 5))
    {
        std::wcout << sendbuf;
        wmemset(sendbuf, 0, 5);
    }
    return 0;
}

但它并没有打印出整个数据,为什么?

【问题讨论】:

    标签: c++ stringstream wstring


    【解决方案1】:

    std::wostream::operator&lt;&lt; 带有wchar_t* 参数,因此它无法知道缓冲区的长度。您的缓冲区中需要一个额外的空间用于终止零。

    int main(int argc, char* argv[]) {
        std::wstringstream buf(L"dsadsadsad dsadsadsad sadsadsadsad sa dsadsadsads dasdsadsa");
        wchar_t sendbuf[6];
        wmemset(sendbuf, 0, 6);
    
        while (buf.read(sendbuf, 5))
        {
            std::wcout << sendbuf;
            wmemset(sendbuf, 0, 6);
        }
        return 0;
    }
    

    【讨论】:

    • 你也可以使用std::wcout.write()代替std::wcout &lt;&lt;,那么你就不需要空终止sendbuf,例如:std::wcout.write(sendbuf, 5);另外,buf.read()将设置@ 987654329@ 到实际读取的字符数,如果您想使用该值而不是硬编码 5
    【解决方案2】:

    您阅读的wchar_tbuf 的阅读量要多,从而破坏了您对wmemset(sendbuf, 0, 5); 所做的零终止。
    如果在循环中改变读取量

        while (buf.read(sendbuf, 4))
                              // ^ change
    

    它按预期工作。

    live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多