3

我有一个在三行上有三个整数的文件。它看起来像这样:

000
001
010

我正在尝试将每个整数读入向量位置,但我不知道我是否做得对。这是我的代码:

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
   std::vector<int> numbers;
   std::fstream out("out.txt");

   std::copy(std::ostreambuf_iterator<int>(out.rdbuf()),
             std::ostreambuf_iterator<int>(), std::back_inserter(numbers));
}

我在这里做错了什么?我在进行复制的那一行出现“没有匹配的函数调用”错误。

4

2 回答 2

10

您使用了错误的迭代器。

你需要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_iteratorcharwchar_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>());

在这种情况下不需要额外的大括号。

希望有帮助。

于 2013-03-29T14:37:23.953 回答
0

Read the Book 'C++ How To Program' by Dietal & Dietal, The chapter on Vectors. I assure you, all your problems will be solved. You have opened the text file for output instead of input. Instead of using this function I would suggest that you should read-in strings and copy them into your vector using iterators until EOF is encountered in the file. EDIT: This way is more natural and easy to read and understand if you are new to Vectors.

于 2013-03-29T14:37:54.423 回答