none
Retornando Iterator RRS feed

  • Pergunta

  • Olá pessoal, o programa que estou fazendo é para ler arquivos XML, ainda estou tentando faze-lo ler os comentários, funciona assim: Eu leio uma linha do arquivo e procuro por um comentário nela, vou guardando todos os comentários dessa linha, caso haja algum comentário sem fim nessa linha, eu procuro o fim dele nas outras linhas, caso não haja, eu salvo esse comentário como um comentários sem fim.

    Essa é a função que tenta encontrar um comentário em uma linha

    Os parametros dela são:

    A linha que se deseja encontrar o comentário e um ponteiro indicando se ele encontrou ou não um comentário(Adcionei esse parametro porque não tava dando muito certo retornar um iterator NULL)

    XMListream::ComentariosIt XMistream::encontrar_comentarios(string linha, int* coment)
    {
    
            *coment = -1;
    
            ComentariosIt it;
            Comentario c;
            int f = 0;//Posição do fim do ultimo comentário encontrado
    
            c.posi = 0;//Posição inicial do comentário
    
    
            while(1)
            {
                //Procura o inicio de um comentário
                unsigned i = linha.find("<!--", c.posi);
    
                //verifica se encontramos um comentário
                if(i == string::npos)
                {
                    break;
                }
    
                //Começamos a procura do fim do comentário a partir do inicio do ultimo comentário encontrado
                unsigned _f = linha.find("-->", i+4);
    
                //verifica se encontramos um fim de comentário
                if(_f == string::npos)
                {
                    c.status = COMENTARIO_SEM_FIM;
                    c.linhaf = -1;
                    c.posf = -1;
                    Comentarios.push_back(c);
                    it = Comentarios.end();
                    return it;
                }
    
                c.posi = i;//Posição do começo do comentário
                f = _f+3;//Posição do fim do comentário (_f + 3 = Saimos daqui-->pra aqui)
    
                //Salvamos o comentário
                c.comentario = linha.substr(c.posi, f-c.posi);
                //Apagamos o comentário da string
                linha.erase(c.posi, f-c.posi);
                //Adciona o comentário a lista de comentários
                c.posf = f;
                c.linhai = _linha_;//_linha_ membro da classe que contém a  numeração das linha
                c.linhaf = _linha_;
                c.status = COMENTARIO_OK;
    
                Comentarios.push_back(c);
                *coment = 0;
            }
    
            it = Comentarios.end();//Iterator para retornar
    
            return it;
    }

    Ela retorna um iterator para o último comentário encontrado.

    Se houver um comentário sem fim, ele será sempre o último.

    Essa função é usada por outra que procura pelos comentários, caso retorne comentários sem fim, através do iterator retornada a função que chamará essa procura pelo fim do comentário:

    void XMListream::carregar_comentarios()
    {
        string linha;
        int coment;
    
        while(!xml.eof())
        {
            linha = proxima_linha(true, true);//Pega uma linha do arquivo
    
            ComentariosIt c = encontrar_comentarios(linha, &coment);//Encontra comentários no arquivo
    
            if(coment == -1)
                continue;
    
            if(c->status == COMENTARIO_SEM_FIM)//Verifica o último comentário encontrado
            {
                while(!xml.eof())
                {
                    linha = proxima_linha(true, true);//Pegamos a próxima linha
                    int _f = linha.find("-->", 0);//Encontramos o fim do comentário?
    
                    //Se não vamos para o próximo loop
                    if(_f == string::npos)
                        continue;
    
                    //Se encontramos, preenchemos a estrutura e saimos do loop
                    c->linhaf = _linha_;
                    c->posf = _f;
                    c->status =  COMENTARIO_OK;
                    break;
                }
            }
            //Teste
            else if(c->status == COMENTARIO_OK)
                cout<<c->status<<endl;
        }
    }

    O erro é na hora de retornar o iterator, quando coment != -1 os únicos valores possíveis para c->status são COMENTARIO_OK ou COMENTARIO_SEM_FIM, mas nenhuma das duas opções da certo quando tento usar os valores, já debuguei o código mas não consigo acessao o valor de c->status pelo debugger.

    Aqui a struct Comentario:

      typedef struct Comentario
        {
    
            string comentario;
            int linhai, linhaf;
            int posi, posf;
            int status;
    
        }Comentario;

    • Editado Shoxsz sábado, 2 de março de 2013 12:22
    sábado, 2 de março de 2013 12:18