按块输出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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...