2011-09-13 96 views
0

好的這個程序我工作似乎沒有問題,除了有問題。下面是代碼從文件讀取導致無限循環的問題

#include <iostream> 
#include <fstream> 

using namespace std; 

/* 
Function Name: CalculateBinary 
CalculateBinary takes a number from the main function and finds its binary form. 
*/ 

void CalculateBinary(long InputNum) 
{ 
    //Takes InputNum and divides it down to "1" or "0" so that it can be put in binary form. 
    if (InputNum != 1 && InputNum != 0) 
     CalculateBinary(InputNum/2); 

    // If the number has no remainder it outputs a "0". Otherwise it outputs a "1". 
    if (InputNum % 2 == 0) 
     cout << "0"; 
    else 
     cout << "1"; 
} 


void main() 
{ 
    // Where the current number will be stored 
     long InputNum; 

    //Opens the text file and inputs first number into InputNum. 
    ifstream fin("binin.txt"); 
    fin >> InputNum; 

    // While Input number is not 0 the loop will continue to evaluate, getting a new number each time. 
    while (InputNum >= 0) 
    { 
     if(InputNum > 1000000000) 
      cout << "Number too large for this program ...."; 
     else 
      CalculateBinary(InputNum); 

     cout << endl; 
     fin >> InputNum;   
    } 
} 

這裏是文本文件,我在

12 
8764 
2147483648 
2 
-1 

讀書當我到8764,它只是不斷在這數了一遍又一遍讀。它忽略了2147483648.我知道我可以通過將InputNum聲明爲long long來解決這個問題。但我想知道它爲什麼這樣做?

+0

是2147483648之前的空間應該在那裏? –

+0

看起來很熟悉:http://stackoverflow.com/questions/7397034/infinite-loop-problem – Mysticial

+0

取決於來自binin.txt的輸入這個程序可能有UB。 – wilhelmtell

回答

4

這是你寫的這種循環的常見問題。

正確和慣用的循環是這樣的:

ifstream fin("binin.txt"); 
long InputNum; 
while (fin >> InputNum && InputNum >= 0) 
{ 
    //now construct the logic accordingly! 
    if(InputNum > 1000000000) 
     cout << "Number too large for this program ...."; 
    else 
     CalculateBinary(InputNum); 
    cout << endl; 
} 
+1

立即中止 – pezcode

+0

@pezcode:有一個錯字。我想用0, – Nawaz

+0

@Nawaz初始化'InputNum',只是反轉while循環條件。 – MSN

0

看來您的平臺上的long類型是32位寬。數字2147483648(0x80000000)太大而無法表示爲帶符號的32位整數。您可能需要一個無符號類型(顯然不適用於負數)或64位整數。

此外,你應該檢查讀取是否成功:

... 
    cout << endl; 
    if (!(fin >> InputNum)) break; // break or otherwise handle the error condition 
} 
0

你不檢查EOF,從而陷入一個死循環。 fin >> InputNum表達式返回true如果成功,否則false,所以改變了你的代碼這樣的事情會解決這個問題:

while ((fin >> InputNum) && InputNum >= 0) 
{ 
    // ... 
} 
2

這個數字太大了long存儲,所以fin >> InputNum;什麼都不做。您應該始終讀爲while(fin >> InputNum) { ... },因爲這會在故障時立即終止循環,或者至少檢查流狀態。