c++ - 从字符串流中读取内容

标签 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 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;
}

我得到了输出:

Stream contents: 'Un texto con datos de ejemplo para probar la extacci¾n de un stream'
Read: 15
Un texto con da
---
Read: 15
tos de ejemplo
---
Read: 15
para probar la
---
Read: 15
extacci¾n de un
---
Read: 5
 stre
---
Read: 0

---

正如您可能注意到的,最后一个读取操作只读取了 5 个字符,遗漏了最后两个“am”,即使它应该能够读取它。我错过了什么吗?

最佳答案

实际上,readsome 只会立即读取 available characters 这取决于平台,因此当流中仍有字符时返回 0 是完全允许的,后续调用可能会返回丢失的字符。 要获取所有可用数据,我宁愿结合使用 readgcount 来获取您阅读的字符数。

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 );

澄清一下:
虽然我相信,您观察到的行为是标准允许的,但我不明白为什么当输入流基于字符串文字时实现应该表现得像这样(我不熟悉流的实现细节)。您可以检查的是,如果 read 实际上对应于 rdbuf()->in_avail(),如果不对应,这可能确实是一个编译器错误。

关于c++ - 从字符串流中读取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183931/

相关文章:

c++ - 'texture2D' : function is removed in Forward Compatibile context

java - 如何将字符串插入到输出字符串流中

c++ - 字符串流数据损坏的问题。

c++ - 字符串转换中的十六进制值

c++ - 在 C++ 中,您可以在子类中扩展具有不同参数值的参数化基类吗?

c++ - 如何使用纯 C++ 而不是 C++/CLI 开发通用 Windows 10 应用程序?

c++ - 返回值或修改通过引用传递的参数是否更快?

c++ - 负尺寸_t

c++ - 从整数值返回固定长度的 std::string

c++ - 使用 stringstream 在内存中超出范围的问题