参看守则实例,这是这样做的三种共同方法。 首先,只要我们有有效的愤怒,我们就可以选择读写:这是比较容易的办法。 (要求包括:推定在场)
int main() {
std::vector<int> values;
int i;
while((std::cout << "Enter a number: ") && (std::cin >> i))
values.push_back(i);
// We ve finished reading all values we could, let s work on them.
}
这种做法既简短又简单,让用户继续进入“exit”,或者实际上不会有数量的东西。 这样做的好处是,你可以将档案转至档案中,在档案结尾处必须“挖掘”(EOF将正确终止该档案)。 然而,这意味着,出现错误的用户不能再输入任何数据。
或者,你们也可以使用类似的东西,读到上游结束之前,然后在此之后 exception一个例外。 这并非特别令人痛心:作为正常方案逻辑的一部分,你最终放弃了例外,但一般没有得到批准。 否则,你就能够归还一个违约的物体,或者通过某种其他手段表示失败,但其中任何一个都不会达到特别的目的。
// You could pass in output streams for prompts and errors, too.
template<typename T>
T read(std::istream& is, std::string const& prompt, std::string const& error) {
T t;
while ((std::cout << prompt) && !(is >> t)) {
if (is.eof())
throw std::runtime_error("End of stream.");
std::cerr << error;
is.clear();
is.ignore(std::numeric_limits<std::streamsize>::max(),
);
}
return t;
}
int main() {
std::vector<int> values;
int i = 1;
// This way, an input of 0 will terminate the loop. I ve deviated from
// `exit terminating the loop -- sentinel values like that aren t very
// flexible, so I wouldn t advise using it.
try {
while (i = read<int>(std::cin, "Please enter an integer:
", "Error!
"))
values.push_back(i);
}
catch (std::exception& e) {
// Have fun figuring out if this is end of input or something utterly unrelated.
}
}
This will let you take input several times, but it s not quite as neat, and takes a lot more code.
Finally, a balance of the two uses lexical_cast
for the conversion. This is part of boost, but if you d rather only use things provided by the standard library, it can be implemented as
template<typename OUT, typename IN>
OUT lexical_cast(IN const& in) {
std::stringstream ss;
OUT o;
ss << in;
ss >> o;
// You may want more thorough error checking code
if (!ss)
throw std::runtime_error("Bad cast");
return o;
}
这将根据代表的文字而不是双手方式,从一个类别变为另一个类别。 你们现在能够这样做。
int main() {
std::vector<int> values;
std::string input;
while ((std::cout << "Enter an integer: ") && (std::cin >> input)) {
if (input == "exit")
break;
try {
values.push_back(lexical_cast<int>(input));
}
catch (std::runtime_error& e) {
// Tell about the error, etc.
}
}
}
在某些情况下,其中一种显然比另一种情况好;这取决于预期的投入方法(将是一种用户打打字材料或改用标准投入的档案?)以及必须如何抵制不正确的投入。