2017-04-03 97 views
-1

我正在使用C++語言完成酒店預訂表。對於fin!= 0,我不會收到操作員錯誤。我如何解決這個錯誤?這裏是實際編碼...沒有操作員錯誤代碼

void Hotel::show_room_record() 
{ 
    cout << "R.Num" << setw(10) << "R.Stat" << setw(10) << "Category" << setw(10) << "Rent\n"; 
    ifstream fin("room.dat", ios::in); 
    for (int p = 0; fin != 0; p = p + 15) 
    { 
     fin.seekg(p); 
     fin >> room_no; 
     fin >> room_status; 
     fin >> category; 
     fin >> rent; 
     cout << room_no << setw(10) << room_status << setw(10) << category << setw(10) << rent << "\n"; 
    } 
    fin.close(); 
} 
+1

你爲什麼試圖比較'fin!= 0'?你期望做什麼? – jtbandes

回答

2

你不能比較fin和0,fin不會返回下一個輸入。 首先將輸入存儲在一個變量中,然後進行比較。

對於您的情況,您可能需要檢查下一個字符是'0'還是'\ 0'。 嘗試使用這樣的: http://www.cplusplus.com/reference/istream/istream/peek/

你的條件爲(假設你要 '\ 0'):

fin.peek() != 0 
1

您不能測試fin != 0fin不是一個數字,爲​​了測試與0的相等程度,使得測試一個蘋果是什麼樣的橙子的意義。你可以通過利用operator bool來測試fin是否仍然可讀,儘管使用簡單的fin,但這很棘手,因爲測試是可讀的,將在閱讀之前進行。在您有機會失敗之前,您無法測試失敗,並且會導致上次讀取失敗並且未檢查有效性的可能性。

而不是試圖解決這個問題,我要在這裏go all X-Y在這裏,並建議完全不同的東西。

定義的結構

struct room 
{ 
    int room_no; 
    string room_status; 
    string category; 
    int rent; // could be a float. Don't care much for this example 
       // that said, watch out for rounding errors when dealing with floats 
}; 

創建一個功能,使得它很容易閱讀到這個結構

std::istream & operator>>(std::istream & in, 
          room & inroom) 
{ 
    in >> inroom.room_no >> inroom.room_status >> inroom.category >> inroom.rent; 
    return in; 
} 

創建一個功能,使得它很容易編寫這種結構

std::ostream & operator<<(std::ostream & out, 
          const room & outroom) 
{ 
    out << outroom.room_no << setw(10) << outroom.room_status << 
      setw(10) << outroom.category << setw(10) << outroom.rent; 
    return out; 
} 

使上述結構的std::vector成員在Hotel

std::vector<room> rooms; 

的文件讀入到它

room temp; 
while (in >> temp) 
{  
    rooms.push_back(temp); 
} 

現在酒店知悉所有房間的狀態,而無需守望着文件。這使打印變得容易。

for(room & r: rooms) 
{ 
    cout << r << '\n'; 
} 

這使得現在發現任何房間房間

for(room & r: rooms) 
{ 
    if (r.whatever == desiredwhatever) 
    { 
     return r; 
    } 
} 

,每一個簡單的遍歷,然後你重寫該文件,如果一個房間被改變。

std::ostream outfile("path to file goes here"); 
for(room & r: rooms) 
{ 
    if (!(outfile << r << '\n')) 
    { 
     //handle error 
    } 
} 

所有這些事情你可能必須做。唯一的缺點是,如果你不允許使用std::vector。在這種情況下,你要麼寫一個簡單的vector替代品,要麼使用數組,並祈禱它永遠不會溢出。