[英]cin: check if number is an integer or float even if float value is 1.000
在以下方式使用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
這些行將以float或int開頭。 如果行以float開頭,我想讀1000多個浮點數。 如果它是一個int,我想讀取那個浮點數。 我知道我可以將float轉換為int並檢查casted int是否等於float,但是當float具有平坦值(例如1.000)時,這將不起作用。
我更喜歡不使用getline()來讀取整行,因為在后面分割它是非常耗時的,而且我已經知道所有的輸入都是浮點數,除了可能是第一個數字。 另一種方法是將每行的第一個值作為字符串讀入,並檢查它是否包含句點。 有沒有一種方法,沒有先讀取輸入作為字符串,檢查這個? 或者是需要的字符串步驟。
你真的需要把它讀作一個字符串來檢查是否有一個點嗎?
為什么不先取整數?
int intNum = 0; char ch;
cin >> intNum;
cin.get(ch);
現在你可以使用另一個整數讀取並組合到一個浮點數,如果有一個點,即ch=='.'
搜索點,如果它們是字符串,則將其解析為。
一種方法是以字符串形式讀取第一個字段,然后測試它是否包含小數位。 如果是這樣,那么將其投入浮動並閱讀更多內容。 否則,將其轉換為整數並讀取那么多。 這很好用,因為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;
}
假設我正確理解了這個問題,也許你需要這樣的東西:
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.”這樣的值可能有效),這應該按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.