您使用了错误的迭代器。
你需要istreambuf_iterator
,而不是ostreambuf_iterator
:
std::copy(std::istreambuf_iterator<int>(out.rdbuf()),
std::istreambuf_iterator<int>(), std::back_inserter(numbers));
请注意,这ostreambuf_iterator
是一个输出迭代器。它是用来写的,不是用来读的。您要做的是,阅读您需要的内容istreambuf_iterator
。
可是等等!上面的代码也不行,为什么?
因为您正在使用istreambuf_iterator
并传递int
给它。将数据作为或类型的未格式化缓冲区istreambuf_iterator
读取。的模板参数可以是或。char*
wchar_t*
istreambuf_iterator
char
wchar_t
您实际需要的是istream_iterator
读取给定类型的格式化数据:
std::copy(std::istream_iterator<int>(out), //changed here also!
std::istream_iterator<int>(), std::back_inserter(numbers));
这现在会很好用。
请注意,您可以避免使用std::copy
,并将其std::vector
自身的构造函数用作:
std::fstream in("out.txt");
std::vector<int> numbers((std::istream_iterator<int>(in)), //extra braces
std::istream_iterator<int>());
请注意第一个参数周围的额外花括号,用于避免在 C++ 中进行令人烦恼的解析。
如果已经创建了矢量对象(并且可以选择其中包含一些元素),那么您仍然可以避免std::copy
:
numbers.insert(numbers.end(),
std::istream_iterator<int>(in), //no extra braces
std::istream_iterator<int>());
在这种情况下不需要额外的大括号。
希望有帮助。