【问题标题】:istream_iterator to initialize vectoristream_iterator 初始化向量
【发布时间】:2012-09-25 15:06:53
【问题描述】:

我正在尝试从 ifstream fin 中读取并使用 istream_iterators 将其放入向量 vec1 中。我到处都看到了这些东西:

vector<int> vec1((istream_iterator<int>(fin)),istream_iterator<int>);

我想保留 istream_iterators 以供以后使用,所以我认为“这应该可以工作”:

istream_iterator<int> iit(fin);
istream_iterator<int> eos;
vector<int> vec1(iit,eos);

...它不起作用=(我的向量完全为空。(我从中读取的文件是一个txt文件,只有数字)。

编辑: txt 如下所示:

06351784798452318596415234561
6641321856006

【问题讨论】:

  • 数字之间有空格吗?如果没有,或者第一个空格字符之前的第一个数字序列,那么可能是数字大于最大整数值,不会被读取。
  • 您能否提供一个完整的、最小的示例以及确切的输入?有关详细信息,请参阅SSCCE.ORG

标签: c++ vector istream-iterator


【解决方案1】:

作为中间步骤,您可能想立即尝试迭代序列以查看是否存在某些内容(可能没有):

while (iit != eos) {
    std::cout << *iit++ << '\n';
}

如果这没有打印任何内容,请检查您的流最初是否处于良好状态:

if (!fin) {
    std::cout << "file not opened!\n";
}

如果流仅包含数字且没有空格,则它可能会溢出并导致读取 int 失败。

【讨论】:

  • 我尝试迭代序列,但它是空的。而且我已经有了一个文件控制。
【解决方案2】:

根据评论,第一个数字序列大于 int 的最大值,因此输入操作将失败,导致 vector 保持为空。

您可以使用std::numeric_limits 模板获取int 等的最大值:

std::cout << std::numeric_limits<int>::max() << "\n";

【讨论】:

  • 谢谢!我尝试用空格分隔数字,现在效果很好!
猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 2023-03-10
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多