【问题标题】:Using iterator to read input [closed]使用迭代器读取输入
【发布时间】:2021-08-14 16:35:29
【问题描述】:

我有以下代码,它具有sin_start(cin) 功能。我不确定 C++ 中是否定义了任何此类函数,或者我是否需要自己定义它。但不知何故,这段代码也可以编译和运行。

#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    cout << "Enter integers: ";
    istream_iterator<int> sin_start(cin);
}

【问题讨论】:

  • 我认为您使用的标签的 wiki 中涵盖了您的问题的答案。你读过吗?
  • @cigien 我无法通过谷歌搜索找到它。可以贴一下链接吗?
  • 您可以像使用任何其他迭代器一样使用它。 int x = *(sin_start++);stdin 中读取一个整数。
  • 但是如何读取直到遇到输入?
  • sin_start 不是函数。它是一个变量。这条线定义了它。 在遇到输入之前如何阅读?这是一个完全不同的问题,与您的主要问题无关。

标签: c++ istream-iterator


【解决方案1】:

代码可以编译,因为它是有效代码。它只是没有做任何有意义的事情。

sin_start 不是函数,它是istream_iterator&lt;int&gt; 类型的变量,其中istream_iterator&lt;iterator&gt; 头文件中定义的模板类。它正在将std::cin 作为参数传递给它的构造函数,因此它知道从哪个流中读取数据。

但代码在构造该变量后简单地退出。它没有尝试读取任何数据。为此,请尝试更多类似的方法:

#include <iostream>
#include <iterator>
using namespace std;

int main() {
    cout << "Enter integers: ";
    istream_iterator<int> sin_start(cin), end;
    while (sin_start != end) {
        int value = *sin_start++;
        // do something with value...
    }
}

这将读取整数,直到用户取消终端上的输入。

但是,在 cmets 中,您提到要读取整数,直到用户按下 Enter。在这种情况下,您需要一种不同的方法,因为istream_iterator 在内部使用operator&gt;&gt;,它会在每次读取时跳过前导空格,并且 Enter 被视为空格。尝试更多类似的方法:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    cout << "Enter integers: ";
    string line;
    getline(cin, line);
    istringstream iss(line);
    int value;
    while (iss >> value) {
        // do something with value...
    }
}

【讨论】:

  • 感谢您的帮助。另外我想知道这是c++的官方网站:en.cppreference.com还是有其他值得浏览的在线资源?
  • @Juan 不,它不是官方网站。但它是一个相当准确和全面的参考,常用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2021-05-24
  • 2012-02-10
  • 1970-01-01
  • 2022-11-14
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多