0

次の行を含むファイルがあります。

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

数字とテキストはそれぞれ1つのタブで区切られ、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

これは最小限の例にすぎません。ファイル全体とパーサーはより複雑であり、最初の要素には直接解析を使用し、残りの要素にはgetl​​ineを使用したいと思います。行の解析について私は何を誤解してgetlineいますか?また、空の行を取得しないようにするにはどうすればよいですか?

4

2 に答える 2

5

operator>>(istream, string)抽出されたトークンの後の最初の空白文字までを読み取りますが、これは含まれません。

トークンを抽出した後に残りの行をスキップするには、次のいずれかを使用できます。

std::cin >> std::ws;

(改行だけが残っていることがわかっている場合)、または

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

関係なく行末までスキップします。

于 2012-07-09T13:05:00.587 に答える
4

私が推測しているのは

file >> buildingName;

カーソルを次の行に移動しませんが、現在の行の最後に置きます。したがって、を呼び出すとgetline、空の文字列を読み取ってから次の文字列に移動します。

于 2012-07-09T13:01:19.310 に答える