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(.back()在 c++11 中添加)

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

您可以在之前添加它istringstream iss(line);,它会删除所有尾随空格字符。

于 2013-05-27T11:01:36.957 回答