2017-04-13 51 views
0

所以,我在使用C++代碼時遇到了一些問題。我有以下代碼,但到目前爲止,我無法獲取存儲在結構化數據類型中的大部分數據。結構中的整數,字符和浮點數

//structured data declaration 
    struct item 
    { 
     int itemCode; 
     char description[20]; 
     float price; 
    }; 

然後get代碼看起來像這樣。

cout << setprecision(2) << fixed << showpoint; 

ofstream salesFile ("Sales.txt"); 
ifstream stockFile ("Stock.txt"); 
for (counter = 0; counter < 9; counter++) 
{ 
    stockFile >> instock[counter].itemCode; 
    stockFile.getline (instock[counter].description, 20); 
    stockFile >> instock[counter].price; 
} 

輸出應該看起來像:

1234 「的描述在這裏」 999.99 數量X

這是輸出:

1234 0.00 數量5

+2

請提供[MCVE]。 – clcto

+1

或者至少是「stockFile」的格式。 –

+1

如果說明位於商品代碼後面的行中,則需要在調用getline()之前先閱讀新行。否則,它只會讀取項目代碼後面的其餘部分。 – Barmar

回答

1

如果你有一個文件格式的形式是(對於一個條目)

1234 
description here 
999.99 

(跨多行),那麼原因很簡單在你的循環,

次讀取代碼不

stockFile >> instock[counter].itemCode; 
stockFile.getline (instock[counter].description, 20); 
stockFile >> instock[counter].price; 

將在這個序列的工作

  1. instock[counter].itemCode將收到值1234。但是(這點很重要)1234之後的換行符仍然會在流中等待被讀取
  2. getline()的電話會遇到換行符,並立即返回。 instock[counter].description將包含字符串""
  3. 表達式stockFile >> instock[counter].price將在說明中遇到d。這不能被解釋爲一個整數值,所以instock[counter].price將保持不變。

假設某些前面的代碼(您未顯示)將instock[counter].price設置爲999.99上述事件順序將解釋您的輸出。

真正的問題是,您在一個流中混合了輸入樣式。在這種情況下,將流媒體運算符>>的使用與使用面向行的輸入(getline())混合使用。根據我對上面序列的描述,不同風格的輸入以不同的方式相互作用,因爲(在這種情況下)它們在遇到換行符時行爲不同。

有人會在閱讀instock[counter].itemCode後告訴你跳過換行。該建議有缺陷,因爲它不能很好地應對變化(例如,如果文件格式更改爲在另一行上包含附加字段會發生什麼情況?如果該文件對於某些預期格式不是「完全」原因?)。

更一般的解決方案是避免在一個流上混合輸入樣式。通常的做法是使用getline()來讀取流中的所有數據(即不使用>>直接與stockFile交互)。然後解釋/解析每個字符串以找到所需的信息。順便提一句,使用標準std::string(來自標準標頭<string>),而不是使用char的數組來保存字符串,請嘗試使用標準std::string(來自標準標頭<string>)。這具有std::string可根據需要調整其長度的優點。 std::getline()也有一個超載,可以愉快地閱讀std::string。一旦數據從您的流中作爲std::string讀取,它可以根據需要進行解釋。

有很多方法可以解釋一個字符串(例如從中提取整數值)。我會留下找到一個方法來作爲一個練習 - 你會通過自己來做更多的學習。

+0

我的確很感謝幫助,但不幸的是,這個任務的提示明確禁止使用字符串對象。然而,使用getline()運算符也是我最初的想法,但我不確定它是否可用於整數和浮點變量。 –

+0

然後使用'getline()'將一行讀到'char'數組中,並解析它。儘管如此,您可能需要檢查並處理文件中的行數可能比您的數組長。 – Peter