2014-02-22 51 views
0

我有以下代碼,但我知道它是如何工作的以及它做了什麼,但是完全沒有。我不明白這三條線是如何工作的 std :: stringstream lineStream(line); std :: string cell; std :: getline(lineStream,cell,';') 特別是lineStream one; 我在谷歌找到他們,但沒有足夠的解釋。你能解釋我的行爲嗎?或者請分享一個好鏈接?由於提前,有一個愉快的一天:)類stringstream。不能理解lineStream是如何工作的,它的參數;

container *begin = new container; 
    begin->beginBox = new box; 
    container *last = NULL; 

    std::ifstream data(filename); 
    std::string line; 
    std::getline(data, line); 

    for (container *i = begin; !data.eof() && std::getline(data, line);) 
    { 
     std::stringstream lineStream(line); 
     std::string cell; 
     std::getline(lineStream, cell, ';'); 
     i->ID = atoi(cell.c_str()); 
     for (box *j = i->beginBox; std::getline(lineStream, cell, ';'); j->next = new box, j = j->next) 
     { 
      j->apples = atoi(cell.c_str()); 
      i->lastBox = j; 
     } 

     i->lastBox->next = NULL; 
     i->nextCont = new container(), last = i, i = i->nextCont, i->beginBox = new box; 
    } 
    setAutoIncrement(begin->ID + 1); 
    last->nextCont = NULL; 
    return begin; 
+0

在外部循環條件中,您不需要'!data.eof()',std :: getline'調用將返回流對象,並且可以直接在布爾表達式中使用它。 –

+0

好的,謝謝。 – Eugene

+0

至於你的問題,請閱讀['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)和['std :: stringstream'](http:/ /en.cppreference.com/w/cpp/io/basic_stringstream)。 –

回答

2
std::stringstream lineStream(line); 

聲明一個叫做std::stringstream類型的lineStream變量。它將line字符串傳遞給its constructor (2)std::stringstream類型用一個流接口包裝一個字符串。這意味着你可以像coutcin那樣對待它,使用<<>>來插入和從字符串中提取東西。這裏,lineStream正在創建,因此您可以稍後使用std::getline提取其內容。

std::string cell; 

這只是聲明瞭一個空std::string稱爲cell

std::getline(lineStream, cell, ';'); 

函數std::getline (1)需要一個流,它將從第一個參數中提取一行。第二個參數是std::string,它將提取行。沒有第三個參數,「行」的結尾被認爲是我們看到換行符的地方。但是,通過傳遞第三個參數,此代碼正在使行結束於;。因此,對std::getline的這個調用將從流中提取所有內容,直到找到;字符並將該內容放入cell。然後丟棄;字符。


這是非常類似上面的代碼:

std::ifstream data(filename); 
std::string line; 
std::getline(data, line); 

這裏,流是文件流而不是字符串流,並std::getline將提取所有到一個換行符,因爲沒有第三個論點是給出的。

+0

謝謝約瑟。這是否意味着stringstream lineStream與通常的字符串非常相似,但區別在於stringstream允許使用>>和<<? – Eugene

+0

getline和string很明顯,但是根本沒有streamtring – Eugene

+0

@ user3336406 getline必須將流作爲第一個參數。 'line'不是流,所以你不能單獨傳遞它。相反,你可以創建一個'std :: stringstream',它爲你提供的任何字符串提供一個流接口,然後你可以將它傳遞給'getline'。 –

相關問題