2012-07-09 109 views
0

我有一個包含文件中以下行:爲什麼函數getline返回空行,如果不存在

5556 
0 bla.dxf 
1 blub.dxf 
2 buzz.dxf 

的數字和文字是由每個單個標籤分隔,有5556後沒有空格字符以下代碼用於解析。

int main(int, char**){ 
    std::ifstream file("test.bld"); 
    std::string buildingName; 
    file >> buildingName; 
    std::cout << buildingName << std::endl; 
    std::string buf; 
    while(getline(file, buf)) { 
    if(buf.empty()){std::cout << "String was empty"<<std::endl;} 
    else std::cout << buf << std::endl; 
    } 
    return 0; 
} 

當我解析文件時,我得到一個空行,雖然顯然沒有。 輸出結果如下:

5556 
String was empty 
0 bla.dxf 
1 blub.dxf 
2 buzz.dxf 

這只是一個最小的例子。整個文件和解析器都比較複雜,我非常希望直接解析第一個元素,其餘的則使用getline。我對getline的行解析有什麼誤解,以及如何避免出現空行?

+2

'operator >>'在輸入緩衝區中留下新的行字符 - 請參閱[本答案](http://stackoverflow.com/a/10842558/1374437)。 – 2012-07-09 13:04:15

+0

剛剛找到以下解釋我的錯誤:http://stackoverflow.com/a/7787253/484230。精髓是:不要混在一起,否則你會陷入困境 – Martin 2012-07-09 13:06:45

回答

4

我假設,因爲

file >> buildingName; 

不將光標移動到下一行,但離開它在當前行的末尾。所以當你打電話給getline時,你會看到一個空字符串,然後轉到下一個。

+0

這就解釋了一些事情。光標何時移動到下一行?當我有純流輸入時,這在>> a >> b >> c跳過換行時也不是問題。但是,通過getline()..的一個動態組合,>> a ... getline,什麼時候換行讀取 – Martin 2012-07-09 13:03:20

+1

@Martin這只是一個假設(可能是正確的)。事情是我不知道,因爲我從來沒有把兩種閱讀方式結合起來。我使用'>>'或'getline'。 – 2012-07-09 13:04:48

+0

該假設是正確的。 '>>'讀取字符串,但不包括任何空格(下一次調用時將跳過空格)。 – 2012-07-09 13:20:06

4

operator>>(istream, string)讀取up to but not including提取的令牌之後的第一個空白字符。

要跳過行的其餘部分提取令牌後,您可以使用

std::cin >> std::ws; 

(如果你知道有僅存的換行符),或

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

跳過無論如何都要結束這一行。

相關問題