C++ 从字符串流读取内容

C++ 从字符串流读取内容,c++,stringstream,C++,Stringstream,我正在测试如何从std::streamstring读取数据,但我弄错了,有人能指出问题出在哪里吗?并给出正确的阅读方法 我的测试代码是: #include <iostream> #include <string> #include <sstream> #define BUFFER_SIZE 16 int main(int argc, char ** argv) { std::stringstream ss; ss << "Un

我正在测试如何从
std::streamstring
读取数据,但我弄错了,有人能指出问题出在哪里吗?并给出正确的阅读方法

我的测试代码是:

#include <iostream>
#include <string>
#include <sstream>

#define BUFFER_SIZE 16

int main(int argc, char ** argv)
{

    std::stringstream ss;
    ss << "Un texto con datos de ejemplo para probar la extacción de un stream";

    std::cout << "Stream contents: '" << ss.str() << "'" << std::endl;

    char buffer[BUFFER_SIZE] = {0};

    std::streamsize read = 0;

    do {
        read = ss.readsome(buffer, BUFFER_SIZE - 1);
        std::cout << "Read: " << ss.gcount() << std::endl;
        std::cout << buffer << std::endl;
        std::cout << "---" << std::endl;
        std::fill(buffer, buffer + BUFFER_SIZE, 0);
    } while ( read > 0 );

    return 0;
}

正如您可能注意到的,上一次读取操作只读取5个字符,而忽略了最后两个“am”,即使它本应该能够读取它。我是否缺少某些字符?

实际上,
readsome
只会立即读取,这取决于平台,因此,当流中仍有字符时,允许返回0,后续调用可能会返回缺少的字符。 要获取所有可用数据,我宁愿使用
read
gcount
来获取您读取的字符数

do {
    ss.read(buffer, BUFFER_SIZE - 1);
    read=ss.gcount();   
    std::cout << "Read: " << ss.gcount() << std::endl;
    std::cout << buffer << std::endl;
    std::cout << "---" << std::endl;
    std::fill(buffer, buffer + BUFFER_SIZE, 0);
} while ( read > 0 );
do{
读取(缓冲区,缓冲区大小-1);
read=ss.gcount();

std::我想你是否需要使用
wchar_t
版本的流和字符串。将
o
替换为常规的
o
会产生相同的结果。我为什么还要使用
wchar_t
呢?我将你的代码复制到一个.cpp文件中,并使用g++编译,没有参数。在我的机器上,整个流都是打印时不带截断,但第一个只读字符只包含一个字符。我使用的是gcc 4.9.2和glibc 2.21-3。关于@BarryGackle的评论,您可以自己查看。可能是VS2008中的一个错误(现在已经很旧了)标准库。可能是一个错误出现在一个编译器中,而不是另一个。也可能是代码中的一个错误,无论出于何种原因,它在不同的编译器/计算机上的表现形式不同(就像您预期的缓冲区溢出一样)。我倾向于其中的第一个,因为似乎有几个人看过你的代码,但我们都没有发现任何明显的问题。不过,你肯定没有做任何明显的错误,否则我们都会看到相同的结果。进行更改可以解决问题。因此,
readsome
应该以池的方式使用吗?(尽管还有剩余内容,但可能返回0事件)@Javier先生:我真的不知道。据我所知,readsome背后的想法是在没有潜在阻塞系统调用的情况下为您提供所有可用字符。因此我不确定您是否能获得所有数据。另一方面,我也不明白,为什么VC++2008的具体实现不会为您提供来自本地字符串对象。但是,如果您谈论的是线程池,我肯定会说不,因为它不是线程安全的,所以无论如何您都必须序列化它。是的,我指的是单线程连续调用。我理解
readsome
的目的是尽可能少地阻塞。但是我测试了将do while条件更改为
!ss.eof()
并且显然
readsome
从不读取整个流,还检查了\u avail
中的
,并从值50开始,每次调用中都会减少,而不会读取最后一个。谢谢。
do {
    ss.read(buffer, BUFFER_SIZE - 1);
    read=ss.gcount();   
    std::cout << "Read: " << ss.gcount() << std::endl;
    std::cout << buffer << std::endl;
    std::cout << "---" << std::endl;
    std::fill(buffer, buffer + BUFFER_SIZE, 0);
} while ( read > 0 );