1

在以下列方式使用 std::cin >> number 时:

float number;
while(std::cin >> number) {
     //perform a check here if possible

    //if number does not contain a decimal point do this
    for(int i = 0; i < number; i++) {
        std::cin >> readMoreFloats; 
    }
    //otherwise read 1000 more floats
}

有没有办法能够区分以下类型的行:

1.500 (1000 more floats)
2 2.000 2.000

这些行将以浮点数或整数开头。如果这些行以浮点数开头,我想再读 1000 个浮点数。如果它是一个 int,我想读取那个数量的浮点数。我知道我可以将 float 转换为 int 并检查转换的 int 是否等于 float,但是当 float 具有诸如 1.000 之类的平面值时,这将不起作用。

我宁愿不使用 getline() 读取整行,因为在后面拆分它非常耗时,而且我已经知道所有输入都是浮点数,除了可能的第一个数字。另一种方法是将每行的第一个值作为字符串读入并检查它是否包含句点。有没有办法在不首先将输入作为字符串读取的情况下进行检查?或者是否需要字符串步骤。

4

4 回答 4

4

您真的需要将其作为字符串读取以检查是否有点吗?

为什么不先取一个整数?

int intNum = 0; char ch;

cin >> intNum;
cin.get(ch);     

现在你可以使用另一个整数读取并组合到一个浮点数,如果有 ia dot iech=='.'

于 2013-03-17T06:18:36.823 回答
0

搜索点,如果它们是字符串,则按原样解析它们。

于 2013-03-17T06:18:27.310 回答
0

一种方法是将第一个字段作为字符串读取,然后测试它是否包含小数位。如果是这样,则将其转换为浮点数并阅读更多内容。否则,将其转换为整数并读取那么多。这很好用,因为 cin 也会在字符串的空格处自动中断。

我认为以下代码应该可以工作:

#include <iostream>
#include <string>
int main()
{

    std::string myStr;
    std::cin >> myStr;

    float myVal = 0;

    if(myStr.find('.') != std::string::npos)
    {
        std::cout << "Is floating point, now convert this and read lots.\n";
        float myFloat = atof(myStr.c_str());
        for(int k =0; k < 1000; k++)
        {
            std::cin >> myVal;
        }
    }
    else
    {
        std::cout << "Is integer, so read just that many\n";
        int myInt = atoi(myStr.c_str());

        for(int k =0; k < myInt; k++)
        {
            std::cin >> myVal;
        }

    }

    return 0;
}
于 2013-03-17T06:22:01.677 回答
0

假设我正确理解了这个问题,也许你需要这样的东西:

using namespace std; // I'm lazy

string temp;
int number;
while(std::cin >> temp)
{
    number = 0;
    if (temp.find(".") != string::npos) number = 1000; // string has decimal point
    else istringstream(temp) >> number; // no decimal point, probably an integer

    for(int i = 0; i < number; i++) {
        std::cin >> readMoreFloats; 
    }
}

我们使用检查字符串是否有小数点的基本方法来指示它是否为浮点数。假设您的输入文件的格式始终正确,并且始终省略整数的小数点(尽管根据某些解释,“2.”之类的值可能是有效的),这应该可以按您的预期工作。

于 2013-03-17T06:25:51.383 回答