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

时间:2012-07-09 12:58:38

标签: c++ string io

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

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 个答案:

答案 0 :(得分:4)

我假设是因为

file >> buildingName;

不会将光标移动到下一行,而是将其留在当前行的末尾。因此,当您致电getline时,您将读取一个空字符串,然后转到下一个字符串。

答案 1 :(得分:4)

operator>>(istream, string)在提取的令牌后读取up to but not including第一个空白字符。

要在提取令牌后跳过剩下的行,您可以使用

std::cin >> std::ws;

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

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

跳到行尾。

相关问题