可能有多个 while (cin>>input)
Possible to have multiple while (cin>>input)
我想知道是否可以有多个 while (cin>>(variable))
,如下面的代码所示:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1, v2;
int input;
while (cin>>input)
v1.push_back(input);
while (cin>>input)
v2.push_back(input);
return 0;
}
我的程序逻辑是让用户在两组int向量中定义元素的数量和每个元素的值。
但是,我意识到在为第一个向量(以 EOF 结尾)输入第一组数字后,我无法为第二个向量输入第二组数字,程序立即终止。我怀疑 EOF 意味着第一个向量的第一个 cin 也由第二个向量的第二个 cin 处理。
上面的程序是否有任何方法可以正确 运行,即有不止一个 while (cin)?
您需要在以 EOF 结束后调用 cin.clear();
(即 CTRL-D 或 CTRL-Z) , 再次使用它。
这个 while 循环一直读取到文件末尾。
结束后就没有了,所以再读下去会失败。
您必须设计另一种方式,以便您的程序 知道 (即具有 条件 )当第一组数字完成时.
通常有两种选择:
先读取值的个数
int count;
std::cin >> count;
for (int i = 0; i < count; i++) {
std::cin >> input;
v1.push_back(input);
}
// read into v2 …
或具有定界值,即无效的特殊值。在这种情况下,我将负数视为无效。
std::vector<int> *v_input = &v1; // first read to v1
while (std::cin << input) {
if (input >= 0)
v_input->push_back(input);
else {
// invalid value, thus push numbers to the next vector
if (v_input == &v1)
v_input = &v2;
else
// invalid value while reading values for v2 - do not read any more lines
break;
}
}
但是,您也可以先将整行作为字符串读取并测试,例如,字符串是否为空。如果是,请将值输入 v2
而不是 v1
。输入的不为空,转为int并push到当前向量。
当您执行 while (cin>>input)
时,您实际上是在要求输入流 cin
生成整数,直到流变坏(即遇到 EOF,steam 无法转换用户的输入到一个整数,或者可能还有另一个问题)。
循环终止后,流的状态仍将处于导致它停止循环的任何状态。为了继续从 cin
读取直到遇到另一个 EOF 令牌,您需要首先清除 eof 失败位,这可以通过使用 cin.clear()
来完成(如 πìντα ῥεῖ 指出的那样)。但是,您应该先检查 cin
的状态,以防由于其他原因(可能用户输入的是单词而不是数字)导致输入失败。
两个选项可能是:检查是否只设置了 eof 位,或者您只能取消设置 eof 位:
if (cin.eof())
{
std::cout << "Yay, reached an EOF" << std::endl;
}
cin.clear(std::ios_base::eofbit);
我想知道是否可以有多个 while (cin>>(variable))
,如下面的代码所示:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1, v2;
int input;
while (cin>>input)
v1.push_back(input);
while (cin>>input)
v2.push_back(input);
return 0;
}
我的程序逻辑是让用户在两组int向量中定义元素的数量和每个元素的值。
但是,我意识到在为第一个向量(以 EOF 结尾)输入第一组数字后,我无法为第二个向量输入第二组数字,程序立即终止。我怀疑 EOF 意味着第一个向量的第一个 cin 也由第二个向量的第二个 cin 处理。
上面的程序是否有任何方法可以正确 运行,即有不止一个 while (cin)?
您需要在以 EOF 结束后调用 cin.clear();
(即 CTRL-D 或 CTRL-Z) , 再次使用它。
这个 while 循环一直读取到文件末尾。 结束后就没有了,所以再读下去会失败。
您必须设计另一种方式,以便您的程序 知道 (即具有 条件 )当第一组数字完成时.
通常有两种选择:
先读取值的个数
int count; std::cin >> count; for (int i = 0; i < count; i++) { std::cin >> input; v1.push_back(input); } // read into v2 …
或具有定界值,即无效的特殊值。在这种情况下,我将负数视为无效。
std::vector<int> *v_input = &v1; // first read to v1 while (std::cin << input) { if (input >= 0) v_input->push_back(input); else { // invalid value, thus push numbers to the next vector if (v_input == &v1) v_input = &v2; else // invalid value while reading values for v2 - do not read any more lines break; } }
但是,您也可以先将整行作为字符串读取并测试,例如,字符串是否为空。如果是,请将值输入 v2
而不是 v1
。输入的不为空,转为int并push到当前向量。
当您执行 while (cin>>input)
时,您实际上是在要求输入流 cin
生成整数,直到流变坏(即遇到 EOF,steam 无法转换用户的输入到一个整数,或者可能还有另一个问题)。
循环终止后,流的状态仍将处于导致它停止循环的任何状态。为了继续从 cin
读取直到遇到另一个 EOF 令牌,您需要首先清除 eof 失败位,这可以通过使用 cin.clear()
来完成(如 πìντα ῥεῖ 指出的那样)。但是,您应该先检查 cin
的状态,以防由于其他原因(可能用户输入的是单词而不是数字)导致输入失败。
两个选项可能是:检查是否只设置了 eof 位,或者您只能取消设置 eof 位:
if (cin.eof())
{
std::cout << "Yay, reached an EOF" << std::endl;
}
cin.clear(std::ios_base::eofbit);