按块输出wstringstream问题

问题描述

我在读取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,5);

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

但是它不能打印出全部数据,为什么?

解决方法

std::wostream::operator<<采用一个wchar_t*参数,因此它不知道缓冲区的长度。您的缓冲区中需要额外的空间来终止零。

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

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

您所读的wchar_tbuf读的多,因此破坏了您在wmemset(sendbuf,5);处所做的零终止。
如果您在循环中更改读取量

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

它按预期工作。

请参见live demo