Ir ao conteúdo
  • Cadastre-se

Delimitadores em arquivo txt


arsenium

Posts recomendados

Boa noite, tenho um problema em que devo ler um texto de um arquivo txt, por exemplo:

 

"OLA <m>MUNDO<\m>. COMO <s>VAI

SEU DIA<\s>?"

 

e quando achar essas marcações ele deve colocar em minusculo o que ta entre <m><\m> e colocar um espaço entre os caracteres entre <s><\s>, sendo que eles podem começar em uma linha e terminar em outra e tal... Eu fiz um exemplo parecido, usando o strtok, mas com esse não está dando certo. Algum help aí? hahaha

deve-se salvar em outro arquivo txt o conteudo "atualizado", mas isso é o de menos

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Aí vai depender de como o arquivo está formatado.

 

1- Você pode ler caracter por caracter e processar, vai ficar ultra lento e detonar o disco;

2 - Ler linha por linha (o arquivo tem \n?) e processar cada linha, também vai usar o disco mais do que deveria; 

3 - Ler tudo, processar na memória e gravar de novo, ideal dependendo do tamanho do arquivo.

 

strtok não me parece a melhor opção para esse caso, o strcmp poderia ajudar mais, entre um strcmp <m> e o outro strcmp </m> você opera o conteúdo e devolve.

 

O <s></s> não entendi o que ele deve fazer, mas a ideia é a mesma.

 

Você tem um array char*, ele te informa aonde começa a tag, você coloca mais 3 posições é a "string" dentro da tag, opera no laço até a posição dada pelo outro strcmp que procura a tag de fim.

 

Processe as tags de forma separada para ficar fácil, primeiro procure todas <m> e depois todas <s>. Se quiser depois otimiza.

 

Depois grava no disco e já era.

Link para o comentário
Compartilhar em outros sites

@Edmorte

 

Aí vai depender de como o arquivo está formatado.

 

1- Você pode ler caracter por caracter e processar, vai ficar ultra lento e detonar o disco;

2 - Ler linha por linha (o arquivo tem \n?) e processar cada linha, também vai usar o disco mais do que deveria; 

3 - Ler tudo, processar na memória e gravar de novo, ideal dependendo do tamanho do arquivo.

 

strtok não me parece a melhor opção para esse caso, o strcmp poderia ajudar mais, entre um strcmp <m> e o outro strcmp </m> você opera o conteúdo e devolve.

 

O <s></s> não entendi o que ele deve fazer, mas a ideia é a mesma.

 

Você tem um array char*, ele te informa aonde começa a tag, você coloca mais 3 posições é a "string" dentro da tag, opera no laço até a posição dada pelo outro strcmp que procura a tag de fim.

 

Processe as tags de forma separada para ficar fácil, primeiro procure todas <m> e depois todas <s>. Se quiser depois otimiza.

 

Depois grava no disco e já era.

 

Não tem como me dar um exemplo de operar entre os strcmp nesse caso? :/

Link para o comentário
Compartilhar em outros sites

@arsenium

 

Foi mal cara, falei o nome da função errada. Abaixo um pequeno código para te mostrar como funciona.

 

Pouco complexo, precisa entender de memória. É apenas um exemplo, use strcpy pra copiar a memória para onde você precisar, não use dessa forma.

#include <stdio.h>#include <string.h>using namespace std;// Texto que você está dando parsechar phrase[] = "Aqui mora <boom>xpto</boom> master";void print_tag_content(char* open_tag, char* close_tag){    /*        Aqui nós encontramos o começo da tag e deslocamos para o começo do conteúdo.       ponteiro value é usado para manter a posição inicial do conteúdo, pois vamos        mover open_tag     */        char* value = open_tag = strstr (phrase, open_tag) + strlen(open_tag);        /*        Precisamos saber qual a posição de close_tag na memória!        Senão o loop abaixo falha.    */        close_tag = strstr (phrase, close_tag);        /*        Move-se open_tag até que ele chegue no close_tag,         ficamos com o tamanho do conteúdo dentro de i    */    // Otimização    int i = close_tag - open_tag;    //int i = 0;    //while(open_tag++ != close_tag) ++i;        //Sabendo o tamanho do conteúdo, finalizamos com fim de string e matamos o resto da string.    value[i] = '\0';        printf(value);}int main() {    // Tag de abertura e fim do elemento a ser procurado    char open_tag[] = "<boom>";    char close_tag[] = "</boom>";    print_tag_content(open_tag, close_tag);            // Perceba que alteramos  o conteúdo original    printf("\n");    printf(phrase);    return 0;}
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>int main(){    FILE *arquivo, *arquivo2;    int i, j, k;    char leitor[100];    char *maiuscula;    arquivo = fopen ("in.txt", "r");    arquivo2 = fopen("out.txt", "a");    if (!arquivo){        exit(1);    }    while (!feof(arquivo)){        fgets(leitor, 100, arquivo);        for(i=0; i<100; i++)        {            if (leitor[i]=='<' && leitor[i+1]=='M' && leitor[i+2]=='>')            {                j=i+4;                do                {                    leitor[j] = toupper(leitor[j]);                    j++;                }while(leitor[j]!='<');                j=0;                //printf ("%s", leitor);                fputs(leitor, arquivo2);            }else if (leitor[i]=='<' && leitor[i+1]=='S' && leitor[i+2]=='>'){                j=i+4;                do                {                    printf ("%c ", leitor[j]); //só para testes                    j++;                }while (leitor[j]!='<');                j=0;            }        }    }    fclose(arquivo);    return 0;}

Galera... Meio que ressuscitando o tópico, hã... Tenho alguns problemas.

1 - Não tenho ideia de como fazer caso uma marcação (<m> ou <s>) comece em uma linha e termine em outra;

2 - Como eu posso colocar no arquivo2 os caracteres separados? Se vocês notarem, eu usei o toupper para deixar as letras em maiusculo, e gravei no arquivo2. Mas acho que não poderei usar a mesma forma para os espaçamentos... ali eu só dei um printf para checagem mesmo. 

 

Basicamente preciso ler de um arquivo, e colocar em outro as especificações das marcações. Ainda não sei se me fiz entender. 

@Edmorte, eu entendi mais ou menos o que voce fez, mas quero usar do "simples"

 

Dando um outro exemplo...

Arquivo entrada:

Basicamente <m>preciso</m> ler de um <s>arquivo

e colocar</s> em outro as especificações das marcações.

Ainda <m>não sei se

me fiz</m> entender. 

 

Arquivo saida:

Basicamente PRECISO ler de um a r q u i v o

e  c o l o c a r em outro as especificações das marcações. 

Ainda NÃO SEI SE

ME FIZ entender. 

 

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...