Si no te importa usar C++11 tienes a regex para buscar expresiones regulares.
un ejemplo que tuve trasteando en un ratico >_<:
Código C++:
Ver original// match_results::prefix/suffix
// - using smatch, a standard alias of match_results<string::iterator>
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main () {
std::string s ( "<td>Rafael</td>" ); //Supongamos que habiamos leido la linea "<td>Rafael</td>" del fichero. Seria librarse de las etiquetas de cierre y apertura para quedar solo con el nombre.
std::regex e ( "<td>" ); //buscamos lo que hay despues de <td> o sea: "Rafael</td>"
std::smatch m; //Aqui se guarda el "<td>" temporalmente
std::cout << "Buscando lo que hay despues de <td> en la cadena \"" << s << "\"\n";
std::regex_search ( s, m, e );
string nombre;
if ( m.ready() ) {
std::cout << m[0] << " found!\n"; //si se encuentra el <td> se guarda aqui -> m[0]
std::cout << "suffix: [" << (nombre = m.suffix()) << "]\n"; // Con esto sacamos lo que hay despues de </td> y lo guardamos en datos a la par que imprimimos tambien >_<
}
//el string nombre ahora contiene todo el sufijo de <td> (la etiqueta de apertura) o sea "Rafael</td>". Tiene todo lo que viene despues de <td>
std::regex etiquetaCierre ( "\\b(</td>)([^ ]*)" ); //buscamos ahora por la etiqueta de cierre "</td>"
nombre = std::regex_replace ( nombre, etiquetaCierre, ""); // si la encuentra la sustituye por "" ¡NADA!
std::cout << "Aqui tienes el nombre de la tabla: " << nombre << endl;
//Es hacer lo mismo
return 0;
}
Ahora si haces eso 2 lineas más tendrías "Marquez" y "67891".
Es leer una linea y pasarlo por el proceso que describí en el ejemplo.
Puede que haya alguna otra cosa mas fácil como un parseador(analizador) de HTML para C++, pero desconozco el tema.
Es seguir investigando.
Deberías leer cosas como Analizador Léxico, Analizador Sintáctico, Analizador Semántico Expresiones Regulares, analizador morfológico...
Muy interesante el tema =D
Suerte!