2017-10-17 86 views
0

我需要解析一個.csv文件,其中行之間的分隔符是'\ n',但任何值都可以包含任意數量的'\ n',如果它被包裹爲「」 。 所以我寫了這個函數,當我把它放到main中時它實際上起作用,但是當它與main分離時不會改變任何變量。在單獨的函數中使用getline()

void getWholeValue(ifstream &ip, string l) { 
getline(ip, l, ','); 
if (l[0] == '"') { 
    string s; 
    getline(ip, s, '"'); 
    l = (l + s); 
}} 

下面是我如何調用該函數的一個例子:

struct Line {string customer;}; 
    int main(){ 
    Line *l = new Line; 
    while (ip.good()) 
      {getWholeValue(ip, l->customer); 
      } 
    delete l; 
} 

所以,當我打電話函數getline這樣到底發生了什麼?指針有什麼問題嗎?也許有更準確的方法來獲得我想要的? 在此先感謝您的幫助。

+1

請使用調試器和看看[的std ::函數getline()](http://en.cppreference.com/w/cpp/string/basic_string的/函數getline)。提取的內容通過第二個參數返回,該參數是一個'std :: string&'。如果你想讓結果出現在'getWholeValue()'之外,你可以使'string l'成爲一個引用:'string&l'。 – Scheff

+0

順便說一句。我看不到'Line * l = new Line;'和'delete l;'的動機。如果您將其更改爲「Line l;」並刪除「delete l;」,它也會起作用。由於這種變化,'l'將被存儲在棧中而不是堆上,我不會將其視爲缺點。 (當然,在這種情況下,您必須將'l-> customer'更改爲'l.customer'。) – Scheff

+0

爲什麼不讓'getWholeValue'返回字符串?它將使API更清潔恕我直言。 'std :: string getWholeValue(ifstream&ip)' –

回答

0

爲了讓您的函數正確更改參數l的值,您需要參數爲std::string &,以便變量通過引用傳遞,因此傳遞的原始變量將被更改而不是在範圍內創建的臨時變量的功能。簡單地改變你的getWholeValue(ifstream &ip, string l)

頭: getWholeValue(ifstream &ip, string &l)