Martin
Martin

Reputation: 4862

Why does getline return empty lines if none exist

I have a file containing the following lines:

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

The numbers and text are seperated by a singular tab each, there is no whitespace character after 5556. The following code is used for parsing.

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;
}

When I parse the file I get an empty line although there obviously is none. The output reads as follows:

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

This is only a minimal example. The whole file and the parser is more complex and I would very much like to use direct parsing for the first element and getline for the rest. What am I misunderstanding about line parsing with getline and how do I avoid getting empty lines?

Upvotes: 0

Views: 8529

Answers (2)

ecatmur
ecatmur

Reputation: 157484

operator>>(istream, string) reads up to but not including the first whitespace character after the extracted token.

To skip the rest of the line after extracting a token, you can either use

std::cin >> std::ws;

(if you know that there is only a newline remaining), or

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

to skip to the end of the line regardless.

Upvotes: 5

Luchian Grigore
Luchian Grigore

Reputation: 258648

I'm assuming because

file >> buildingName;

doesn't move the cursor to the next line, but leaves it at the end of the current line. So when you call getline, you'll read an empty string and then move to the next.

Upvotes: 4

Related Questions