2014-05-06 84 views
0

我是C++初學者。我試圖讀取的格式,像這樣一個文件:讀取數據文件中的多個項目C++

5恭金#3 30.00 1

15雷Allrich#10.25 0 0

...

串號#號碼號碼

其中每個號碼都有其自己的意義,名稱也是如此。我可以打開文件並閱讀前兩個項目,但名稱後面無法獲取數字。這是我現在的功能:

void getItems(ifstream& dataFile, // in file 
      Employee item[], // class array so I can store the data later 
      int &transNum) // number of transactions 
{ 
    int id;    // employee ID 
    char name[20];  // employee name 
    double hourlyPay; // pay per hour 
    int numDeps;  // number of dependents 
    int type;   // employee type 

    transNum = 0; 
    dataFile >> id; 
    dataFile.ignore();     // discard space before name 
    dataFile.getline(name, '#'); 
    dataFile >> hourlyPay >> numDeps >> type; 
} 

我需要它讀取第一個數字,讀取名稱,然後讀取最後3個數字。在每個名字(最多20個字符)之後都有一個#符號,我們應該停止閱讀這個名字。我已經嘗試調整我的字符串和其他小修正的char數組的大小,但沒有任何作用。我意識到我現在只能得到1行......我只是想在第一行工作,然後才做了一個循環來抓取其他行。

回答

1

istream:getline需要的長度參數與字符數組時。目前它使用'#'作爲長度值並使用默認分隔符。 更改您的代碼

dataFile.getline(name, sizeof name, '#'); 

或者,使用一個std:字符串作爲參數傳遞給函數getline,那麼你就需要指定的最大尺寸。

+0

好的。我修改了我的getline行,但現在3個變量(hourlyPay,numDeps和type)變得非常時髦。它們的值是-9.25596e61和-858993460 – KwakKwak

+0

請注意,此解決方案在名稱前後留出空格。 – vmrob

+1

@KwakKwak我試了一下,它似乎爲我工作 - 小時pay等變量填寫正確。 –

0

你非常接近。這個問題很可能是線路

dataFile.ignore(); 

默認情況下,ignore忽略一切up to EOF。你想要做的是忽略一些字符,直到下一個空格。所以這個電話會改爲:

datafile.ignore(100, ' '); 

其中100是純粹任意選擇的數字。代替你自己的理性價值。

接下來是您使用getline必須告訴讀者多少個字符。由於您的緩衝區爲20個字符,您需要通知getline像這樣:

getline(name, 20, '#'); 
+0

值得一提的是,您可以使用'std :: numeric_limits :: max()'來代替使用100。從http://www.cplusplus.com/reference/istream/istream/ignore/:「如果這完全是numeric_limits :: max(),沒有限制:因爲許多字符是根據需要提取,直到delim(或找到文件結尾)「。 – vmrob

+0

@vmrob:是的,這就是我要做的方式,但OP是一個甚至不使用'std :: string'的初學者,所以在我看來,一個任意常數的函數可能會被解釋更多用途。 – Edward

+0

好點!我傾向於不喜歡當前的教學方法,我自己是一名學生,但我完全同意這種擔憂。如果這取決於我,我會在開始學習指針和引用之前,就開始教導諸如'vector','string'以及所有爵士樂之類的東西。 – vmrob