> Como faço em C, para excluir caracteres tipo (. , ; ! ? ... etc) de > dentro de um arquivo texto comum?
Primeiramente, se não fosse em C você poderia utilizar o sed:
sed -i 's/[.,;!?]//g' arquivo.txt
Agora, respondendo sua pergunta, excluir ou adicionar qualquer coisa em um arquivo texto geralmente significa:
I - abrir o arquivo original; - gravar o resultado do processamento em um arquivo temporário; - remover ou renomear (com extensão .bak ou acrescentando ~) o arquivo original; - renomear o arquivo temporário para o nome e local do arquivo original.
II - renomear o arquivo original, abrindo-o em seguida; - criar o novo arquivo com o nome e local do arquivo original; - ler do backup, processar e gravar no novo arquivo; - opcionalmente, excluir o backup se tudo ocorreu bem.
III (considerando que você só irá excluir caracteres e não inserir) - abrir o arquivo original para leitura e gravação; - trabalhar com dois ponteiros: a posição de leitura e a posição de gravação; - neste caso você teria que pular o tempo todo de uma posição para a outra; - não sei como, truncar o tamanho do arquivo. (esta opção eu considero loucura)
Nota: a que eu acho mais segura é a opção I. Se alguma coisa der errado no meio do processamento o arquivo original permanece inalterado.
Se você optar pela opção I ou II você vai simplesmente trabalhar com dois buffers, um de leitura e outro para gravação. Você percorre o buffer de leitura com um contador, i por exemplo, e só joga no buffer de gravação o que interessa.
Exemplo:
char buffer_in[512], buffer_out[512]; FILE *file_in, *file_out; size_t i, j, n;
... /* aqui você renomeia e/ou abre os arquivos conforme a opção escolhida */
while (!feof(buffer_in)) { n = fread( buffer_in, 1, 512, file_in ); for (i = 0, j = 0; i < n; ++i) { if (!strchr( ".,;!?", buffer[i] )) buffer_out[j++] = buffer[i]; } if (j > 0) fwrite( buffer_out, 1, j, file_out );
}
... /* aqui você fecha e/ou renomeia os arquivos conforme a opção escolhida */
Tinha pensado nisso mesmo de outro arquivo, mas não sabia fazer isso.
Vou passar pro linux aqui e testar isso tudo aí....
Valeu mesmo... depois posto se consegui!
Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando
verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor
de string... isso pode? Ou é só pra arquivos?
> Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando
> verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor
> de string... isso pode? Ou é só pra arquivos?
Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor de string... isso pode? Ou é só pra arquivos?
Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor de string... isso pode? Ou é só pra arquivos?
A propósito,
strtok (man 3 strtok) não te ajudaria não ?
E caso você esteja usando C++, as chamads de processamento de strings (
http://cplusplus.com/reference/string/string ) também não poderiam ajudar ?
>> Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando
>> verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor
>> de string... isso pode? Ou é só pra arquivos?
<flavio.thun...@gmail.com> wrote:
> A propósito,
> strtok (man 3 strtok) não te ajudaria não ?
> E caso você esteja usando C++, as chamads de processamento de strings (http://cplusplus.com/reference/string/string) também não poderiam ajudar ?
> > ------------------------------
> > *From:* Marcio Gil
> > Obrigado Flavio pela correção, foi erro de digitação mesmo :-)
> > E desculpe Vellozo pela falha ;-)
> > Qualquer outra dúvida manda o código que você já montou que a gente te
> > ajuda a corrigir.
> > Marcio Gil.
> > ------------------------------
> > *From:* Flavio Alberto Lopes Soares
> > Onde se lê
> > while (!feof(buffer_in))
> > leia-se
> > while (!feof(file_in))
> > O parâmetro de feof() é o descritor de arquivo obtido em fopen() e não o
> > buffer lido.
> > Espero ter ajudado
> > Boa sorte
> > Sucesso
> > Flávio Alberto Lopes Soares
> >> Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando
> >> verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor
> >> de string... isso pode? Ou é só pra arquivos?
> Exato Flávio... usei o strtok...
> vou postar o código qndo estiver no meu note!
> Valeu pela ajuda de todos!
> Abs...
> On 7 dez, 10:11, Flavio Alberto Lopes Soares
> <flavio.thun...@gmail.com> wrote:
> > A propósito,
> > strtok (man 3 strtok) não te ajudaria não ?
> > E caso você esteja usando C++, as chamads de processamento de strings (http://cplusplus.com/reference/string/string) também não poderiam ajudar ?
> > >> Não sei se estou certo mas tá dando uns paus aqui, pq vc está tentando
> > >> verificar, por exemplo ... !feof(buffer_in) mas buffer_in é um vetor
> > >> de string... isso pode? Ou é só pra arquivos?