我可以使用 istream_iterator<char> 将一些 istream 内容复制到 std::string 中吗?
Can I use istream_iterator<char> to copy some istream content into std::string?
我有一个 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[]
作为缓冲区,将其复制到那个缓冲区,等等,但这似乎不那么简单。
std::istream_iterator
是一个 输入迭代器 。输入迭代器是单次传递的,并且在其副本递增时失效。当您执行 std::next(beg, someLength)
时,您会阅读 someLength
个字符。那么beg
就失效了。
此外,std::istream_iterator
也不是为了计算。由于处理流错误的方式,它旨在与默认构造的迭代器进行比较。如果您尝试对它们进行计数,那么它们 有时 会再读一次,具体取决于算法的实现方式。
如果要从输入流中读取 n
个字符,只需使用 read
。如果你想跳过空格,那么就写一个循环。如果您想以意外的方式使用 std::istream_iterator
,那么您的代码将无法预料地失败。
我有一个 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[]
作为缓冲区,将其复制到那个缓冲区,等等,但这似乎不那么简单。
std::istream_iterator
是一个 输入迭代器 。输入迭代器是单次传递的,并且在其副本递增时失效。当您执行 std::next(beg, someLength)
时,您会阅读 someLength
个字符。那么beg
就失效了。
此外,std::istream_iterator
也不是为了计算。由于处理流错误的方式,它旨在与默认构造的迭代器进行比较。如果您尝试对它们进行计数,那么它们 有时 会再读一次,具体取决于算法的实现方式。
如果要从输入流中读取 n
个字符,只需使用 read
。如果你想跳过空格,那么就写一个循环。如果您想以意外的方式使用 std::istream_iterator
,那么您的代码将无法预料地失败。