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

问题描述 投票:2回答:1

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

#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[]作为缓冲区,将其复制到缓冲区中,依此类推,但这似乎不那么简单。

c++ stdstring istream istream-iterator input-iterator
1个回答
0
投票
输入迭代器。输入迭代器是单次通过的,并且当其副本递增时无效。当您执行std::next(beg, someLength)时,将读取someLength字符。然后beg无效。

此外,std::istream_iterator不应计入。由于处理流错误的方式,它被设计为与默认构造的迭代器进行比较。如果您尝试对它们进行计数,那么它们将有时再读一遍,具体时间取决于算法的实现方式。]

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

© www.soinside.com 2019 - 2024. All rights reserved.