首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以使用istream_iterator<char>将一些istream内容复制到std::string中吗?

我可以使用istream_iterator<char>将一些istream内容复制到std::string中吗?
EN

Stack Overflow用户
提问于 2019-10-17 09:08:09
回答 1查看 468关注 0票数 5

我有一个istream,需要将两个分隔符之间的内容复制到一个std::string中。我可以找到分隔符的streampos,但是当尝试使用istream_iterator<char>迭代流的部分时,它不起作用。以下是我尝试过的:

代码语言:javascript
运行
复制
#include <iostream>
#include <sstream>
#include <iterator>


std::string copyToString( std::istream& is )
{
    is >> std::ws;

    auto someLength {10};

    std::istream_iterator<char> beg {is};

    is.seekg( someLength, std::ios::cur );

    //std::istream_iterator<char> end { is };
    std::istream_iterator<char> end { std::next(beg, someLength) };

    return std::string{ beg, end };
}




int main()
{
    std::stringstream ss;
    ss.str( "   { my string content  }" );

    std::cout << "\"" << copyToString( ss ) << "\"\n";

    return 0;
}

我预计输出将有10个字符长,但它只是"{"。如果我取消注释行std::istream_iterator<char> end { is };并注释掉下一行,输出就是""

我遗漏了什么?我能不像那样使用迭代器吗?

我知道我可以创建一个char[]作为缓冲区,复制到它,等等,但这似乎不那么简单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 09:40:52

std::istream_iterator是一个输入迭代器。输入迭代器是一次传递,当其副本递增时无效。当您执行std::next(beg, someLength)时,您会读取someLength字符。那么beg就失效了。

此外,不打算计算std::istream_iterator。由于处理流错误的方式,它被设计成与默认构造的迭代器相比较。如果您尝试计数它们,那么它们有时会再读一次,这取决于算法的实现方式。

如果要从输入流中读取n字符,只需使用read。如果您想跳过空格,那么只需编写一个循环。如果您想以一种意外的方式使用std::istream_iterator,那么您的代码将无法预料地失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58428896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档