gpt4 book ai didi

c++ 如何忽略错误的数据输入?

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:02 25 4
gpt4 key购买 nike

(标题真不好,请帮忙修改)我正在写一个函数,要求用户输入一个整数,如果输入的数据不是整数类型,该函数将返回一个警告。但似乎每当用户输入为“char”/“string”时,该函数一次接受一个字符,因此会打印多行警告消息。有没有办法让函数将错误输入作为一个字符串?还是忽略整个输入?

代码如下:

cout << "Please entre the number of data points (please enter an integer): \n";
cin >> dataNum;
while (cin.fail())
{
cout << "Please enter an integer number. \n";
cin.clear();
cin.ignore();
cin >> dataNum;
}

当我尝试在 .dat 文件中获取检查数据时,出现了类似的问题。我正在从 .dat 文件中提取“double”类型,但有一行包含字符串。有没有一种方法可以将这条线作为一个整体来解释?或者干脆跳过这条线?代码如下:

ifstream myfile(fileName);
if (!myfile.good())
{
cerr << "Error: the file '" + fileName + "' cannot be opened. \n";
return(1);
}

// Dynamically allocate memory for data
double *mydata = new double[dataNum + 1];

// Read data from file, ignoring any additional bad data
while (!myfile.eof())
{
if (myfile.fail())
{
cerr << "Error: Rogue data detected. Bad data will be ignored. \n";
myfile.clear();
myfile.ignore();
n--;
}
myfile >> mydata[n];
n++;
}

// Close file
myfile.close();

最佳答案

问题

您需要保证 double 的输入有效类型。您遇到的具体问题是,当您遇到错误状态时,您没有忽略足够多的无效输入流。您需要重置错误状态,然后在重试之前忽略当前流中的所有内容。

示例解决方案

double dataNum;
// we need to enforce that the input can be stored in double type
while(!(std::cin >> dataNum))
{
std::cout << "Invalid value! Please enter a number." << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

它做什么

std::cin流有错误位 std::cin.fail()在无效输入上设置(在我们的例子中,任何不会转换为 double 类型的东西。std::cin 中的错误位是粘性的,所以当我们遇到无效输入时,我们必须 std::cin.clear() 错误状态,然后 std::cin.ignore() 输入流中当前可能存在的任何数据。您需要忽略流可能能够容纳换行符的最大字符数,因为其中可能存在各种无效内容那里。然后,我们循环直到我们的输入流接收到我们可以存储到我们的 double 类型中的有效数据。std::numeric_limits 驻留在 #include <limits> 中。

关于c++ 如何忽略错误的数据输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com