如何从文件中读取,直到达到特定字符,然后寻找下一个字符并继续用c ++阅读。
在我的程序中我使用一些HTML语法并生成一个htm文件...所以在我的c ++代码中我添加了标签... 但是当我从我的htm文件中读取时,我希望它不包含标签。
我打算做的是读取文件直到'<'遇到然后只是寻求直到'>'遇到并继续从那里读..
请帮助我并指导我这个.. 我对c ++中的文件输入输出不是很有经验.. 谢谢.. :))
答案 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();
}
}