如果不存在,为什么 getline 返回空行

Mar*_*tin 0 c++ string io

我有一个包含以下几行的文件:

5556
0   bla.dxf
1   blub.dxf
2   buzz.dxf
Run Code Online (Sandbox Code Playgroud)

数字和文本分别用单数制表符分隔,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;
}
Run Code Online (Sandbox Code Playgroud)

当我解析文件时,我得到一个空行,尽管显然没有。输出内容如下:

5556
String was empty
0   bla.dxf
1   blub.dxf
2   buzz.dxf
Run Code Online (Sandbox Code Playgroud)

这只是一个最小的例子。整个文件和解析器更复杂,我非常想对第一个元素使用直接解析,对其余元素使用 getline。我对行解析有什么误解getline以及如何避免获得空行?

eca*_*mur 5

operator>>(istream, string)最多读取但不包括提取的标记后的第一个空白字符。

要在提取令牌后跳过该行的其余部分,您可以使用

std::cin >> std::ws;
Run Code Online (Sandbox Code Playgroud)

(如果您知道只剩下一个换行符),或

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)

无论如何都要跳到行尾。