读取文件时有问题的空白区域

时间:2013-05-27 10:34:36

标签: c++ stringstream

我使用以下代码解析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" />
                                                        ^
                                                        ^
                                                        ^

如果输入文件中有新行,则会打印空白字符。如何跳过或删除此字符?

2 个答案:

答案 0 :(得分:1)

您的信息流中没有换行符,当调用getline时,它会将字符提取到换行符。 iss.get()正在返回文件结尾,因为无法提取更多字符。您可以使用以下代码进行检查:

while(iss.good()) {
    c = iss.get();
    if (c == std::char_traits<char>::eof())
    {
        cout << "end of file!";
    }
    else
    {
        cout << c;
    }
}

答案 1 :(得分: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);之前添加它,并删除所有尾随空白字符。