如何读取c ++程序直到读取字符然后跳过一些字符并继续读取

时间:2012-04-02 15:33:10

标签: c++ file file-handling

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

在我的程序中我使用一些HTML语法并生成一个htm文件...所以在我的c ++代码中我添加了标签... 但是当我从我的htm文件中读取时,我希望它不包含标签。

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

请帮助我并指导我这个.. 我对c ++中的文件输入输出不是很有经验.. 谢谢.. :))

4 个答案:

答案 0 :(得分:5)

首先,你应该知道正确地做这件事比你显然想的要复杂得多。

在您提出问题时回答问题,您可以使用istream::get一次读取一个字符,直到您获得'<'。您可以使用ignore忽略下一个'>'之前的字符在溪流中。

回到第一点,通常无法正常工作。特别是,标签完全可以包含字符串,而字符串(依次)包含“>”那是标签的关闭。因此,为了正确解析HTML,您需要解析标记内的字符串,当您找到它们时,跳过其内容而不是处理任何“>”它们可能包含标签的结尾。

答案 1 :(得分:3)

通常,要读取文件直到达到特定字符,您可以使用std::getline并将第二个参数设置为终结符,这样如果您正在阅读直到'<'你可以做的角色

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

然后您可以使用>字符

执行相同的操作

在您的情况下,如果您正在解析HTML,那么可能已经有了特定的解析器。我认为HTML1.1符合XML标准,但HTML1.0并不是因为并不总是需要关闭所有标记,因此XML解析器不一定有效。

您需要假设打开和关闭标记不是注释或引用文本的一部分,我上面描述的方法不会向您承诺,因此您需要一个完整的状态机。

答案 2 :(得分:1)

以下是一些指导原则。

  • 您可以使用getLine中的ifstream逐行阅读文件,并将每一行保留在std::string

  • 您可以使用std::string.find()方法查找<>字符。

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

  • 您可以根据需要将字符串分组到std::vector

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

答案 3 :(得分:1)

以下从标准输入读取;修改/重新设置对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();
    }
}