【问题标题】:How to read from a file until a character is read then skip some characters and continue reading again如何从文件中读取直到读取一个字符然后跳过一些字符并再次继续读取
【发布时间】:2012-04-16 06:42:48
【问题描述】:

如何从文件中读取直到到达特定字符,然后寻找下一个字符并继续在 C++ 中读取。

在我的程序中,我使用了一些 HTML 语法并生成了一个 .htm 文件...所以在我的 C++ 代码中我添加了标签。

但是当我从我的 .htm 文件中读取时,我希望它不包含标签。

我打算做的是读取文件直到遇到'<' 然后一直寻找直到遇到'>' 并从那里继续读取。

【问题讨论】:

  • 只是一个建议,但根据文件的大小(可能很小,因为 HTML),您可以先阅读整个文件。让搜索更容易一些。

标签: c++ file file-handling


【解决方案1】:

一般来说,要读取文件直到到达特定字符,您可以使用 std::getline 并将第二个参数设置为终止符,因此如果您正在读取直到 '

std::getline( infile, str, '<' );

然后您可以对 &gt; 字符执行相同操作

在您的情况下,如果您正在解析 HTML,那么可能已经有特定的解析器。我认为 HTML1.1 与 XML 兼容,但 HTML1.0 不兼容,因为并不总是需要关闭所有标签,因此 XML 解析器不一定能工作。

您需要假设打开和关闭标签不是 cmets 或引用文本的一部分,并且我上面描述的方法不会向您保证,因此您需要一个完整的状态机。

【讨论】:

    【解决方案2】:

    首先,您应该意识到,正确地执行此操作比您显然想象的要复杂得多。

    只需按照您的要求回答问题,您就可以使用istream::get 一次读取一个字符,直到您得到一个“ignore 忽略流中直到下一个“>”的字符。

    但是,回到第一点,这通常不会正常工作。特别是,标签完全有可能包含一个字符串,而字符串(反过来)包含一个'>',它不是标签的结束。因此,要想正确解析 HTML,您需要解析标签内的字符串,当您找到它们时,跳过它们的内容,而不是将它们可能包含的任何“>”视为标签的结尾。

    【讨论】:

    • 如果标签不是嵌套标签,则包含未转义的&gt; 的标签将无效。我认为最好的提示是:在有效的 html 文件中,&lt; 的数量总是与 &gt; 一样多。
    • 根据W3c,普通文本不能包含“”没有这样的限制。
    【解决方案3】:

    这里有一些指导方针。

    • 您可以使用 getLineifstream 逐行读取文件,并将每一行保存在 std::string

    • 您可以使用std::string.find()方法查找&lt;&gt;字符。

    • 可以使用std::string.substr()方法获取子字符串。

    • 如果需要,您可以将字符串分组到std::vector

    你不会在这里得到一个完整的实现,但这应该足以让你开始。

    【讨论】:

      【解决方案4】:

      以下从标准输入读取;修改/重新调用 getchar() 以从其他地方读取。

      int c;
      
      c = getchar();
      while ( c != EOF ) {
          while ( c != '<' && c != EOF) {
              /* Do something with character outside tag? */
              c = getchar();
          }
          while ( c != '>' && c != EOF ) {
              /* Do something with character inside tag? */
              c = getchar();
          }
      }    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 2011-02-08
        • 2023-03-10
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多