0

私はこのコードでhtmlドキュメントを解析しています:

ifstream myfile("file.html");

  string line;
  int m_lines;
  char c;

  while(getline(myfile,line)) {
    if(line.empty()) {
      m_lines++;
      continue;
    }
    istringstream iss(line);

    while(iss.good()) {
      c = iss.get();
      //my code here (not important for this question)
      cout << c;
    }


    m_lines++;
  }

入力ファイル (file.html) は次のようになります。

<p>Lorem ipsum <strong>haha</strong> gfadf.</p>
<img src="image.jpg" alt="alt" />

出力:

<p>Lorem ipsum golo gama<strong>haha</strong> gfadf.</p> <img src="image.jpg" alt="alt" />
                                                        ^
                                                        ^
                                                        ^

入力ファイルに改行がある場合、空白文字が出力されます。このキャラクターをスキップまたは削除するにはどうすればよいですか?

4

2 に答える 2

1

ストリームには改行がありませんgetline。呼び出されると、改行までの文字が抽出されます。抽出する文字がこれ以上ないため、ファイルiss.get()の終わりを返しています。次のコードで確認できます。

while(iss.good()) {
    c = iss.get();
    if (c == std::char_traits<char>::eof())
    {
        cout << "end of file!";
    }
    else
    {
        cout << c;
    }
}
于 2013-05-27T10:56:14.170 に答える
0

文字列の最後の文字が空白文字 ( \f\n\r\t\v.. など) であるかどうかを簡単に確認して削除できます。例:

while (line.back() == '\s')
{
    line.erase(line.end());
}

c++11 を使用していない場合 (c++11.back()で追加されました)

while (line[line.size()-1] == '\s')
{
    line.erase(line.end());
}

それを前に追加するistringstream iss(line);と、末尾の空白文字がすべて削除されます。

于 2013-05-27T11:01:36.957 に答える