2013-03-17 106 views
1

而使用std :: CIN >>數以下列方式:CIN:檢查次數爲整數或浮點即使浮點值是1.000

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開頭。如果行以浮點數開始,我想讀取1000個浮點數。如果它是一個int,我想讀取這個浮點數。我知道我可以將浮點數轉換爲int,並檢查鑄造的int是否等於浮點數,但當浮點數爲1.000等平坦值時,這不起作用。

我寧願不看使用函數getline整行(),因爲後記分割是耗時的,我已經知道,所有輸入的是,除了可能是第一個數字浮動。另一種方法是將每行的第一個值作爲字符串讀入並檢查它是否包含句點。有沒有辦法,沒有首先讀取輸入作爲一個字符串,檢查這個?或者是需要的字符串步驟。

+0

由於「一把手」被聲明爲float則總是被儲存爲float,無論用戶是否進入1.000或只是簡單的1因此,沒有,沒有辦法,你的代碼可能可以區分這兩種情況。 – Stuart

回答

4

你真的需要閱讀它作爲一個字符串,以檢查是否有一個點?

爲什麼不先取一個整數?

int intNum = 0; char ch; 

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

現在你可以使用另一個整數讀&結合的浮動,如果有保險業監督點即ch=='.'

+0

現在這是一個有趣的答案。我沒有想到這一點! –

0

搜索的點,如果是字符串,解析它們作爲。

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; 
} 
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.」這樣的值可能是有效的),這應該按照你的預期工作。