用C++解析文本文件(其中包含HTML)

Parsing a textfile (with HTML in it) with C++

本文关键字:包含 HTML 文件 C++ 文本      更新时间:2023-10-16

我已经能够以html网页的形式获取一些原始数据,然后将其放入一个普通的文本文件中。我目前正试图使用C++程序来解析这个文件,但由于某种原因,它给了我奇怪的输出,因为它在每个字母之间都放了@s、符号和^Ms。我不确定这是因为我试图解析HTML文件,还是因为我的代码错误,但我在较小的HTML文件上尝试过我的代码,它运行良好。我想让它工作的文件只有145kB

这是我的代码:

#include <iostream>
#include <fstream> 
#include <string>
using namespace std;
int main(int argc, char** argv)
{
  ifstream inFile;
  inFile.open(argv[1]);
  string str;
  while(getline(inFile, str))
  {
    cout << str << endl;
  }
}

如果有人能告诉我为什么这不起作用,我将不胜感激。

HTML文件几乎可以采用任何编码。OP需要根据其编码打开文件,该文件通常由他作为页面服务的一部分从web浏览器获得。请注意,同一网站提供的每个单独页面可能有不同的编码。"@"可能实际上被打印为"^@",如果您给它们空字符,许多输出例程就会打印出这个值。他可能有一个UTF-16文件,并且正在读取它,假设它是ASCII 8位。

他还需要理解"换行符"约定在不同的机器之间是不同的;他的"^M"可能意味着他在Unix机器上运行(Unix机器认为"^J"是换行符,他从Windows盒子里得到了他的文件,Windows盒子认为"^M^J"就是换行符。欢迎来到现实世界。

接下来,OP会发现解析HTML实际上很困难,因为它很复杂,有很多疯狂的字符约定(除了编码之外),而且通常只是非法的,因为浏览器允许这样做,而不是每次都检查HTML是否干净。

试试这是否适用。

#include <iostream>
#include <fstream> 
#include <string>
using namespace std;
int main(int argc, char** argv)
{
  wifstream inFile;
  inFile.open(argv[1]);
  wstring str;
  while(getline(inFile, str))
  {
      wcout << str << endl;
  }
}