使用std :: cin>>以下列方式编号:
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
这些行将以float或int开头。如果行以float开头,我想读1000多个浮点数。如果它是一个int,我想读取那个浮点数。我知道我可以将float转换为int并检查casted int是否等于float,但是当float具有平坦值(例如1.000)时,这将不起作用。
我更喜欢不使用getline()来读取整行,因为在后面分割它是非常耗时的,而且我已经知道所有的输入都是浮点数,除了可能是第一个数字。另一种方法是将每行的第一个值作为字符串读入,并检查它是否包含句点。有没有一种方法,没有先读取输入作为字符串,检查这个?或者是需要的字符串步骤。
答案 0 :(得分:4)
你真的需要把它作为字符串来读取来检查是否有点?
为什么不先取整数?
int intNum = 0; char ch;
cin >> intNum;
cin.get(ch);
现在你可以使用另一个整数读取&amp;如果有一个点,即ch=='.'
答案 1 :(得分:0)
搜索点,如果它们是字符串,则将其解析为。
答案 2 :(得分: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;
}
答案 3 :(得分: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.”等值可能有效),这应该按预期工作。