Remover caractere em um arquivo

1,005 views
Skip to first unread message

Vellozo

unread,
Dec 4, 2009, 3:57:46 PM12/4/09
to ccppbrasil
Como faço em C, para excluir caracteres tipo (. , ; ! ? ... etc) de
dentro de um arquivo texto comum?

Gianni

unread,
Dec 4, 2009, 6:43:15 PM12/4/09
to ccppb...@googlegroups.com
man fopen
man fread

Se não tiver um unix com manpages na mão... digita isso no google

ou, se vc não fizer muita questão;

system( "sed -i -e 's:!:g' arq.txt" );

mas aprender sed é mais dificíl que C! ;-)

Marcio Gil

unread,
Dec 4, 2009, 6:46:24 PM12/4/09
to ccppb...@googlegroups.com

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 */

Marcio Gil.

Vellozo

unread,
Dec 5, 2009, 7:30:40 AM12/5/09
to ccppbrasil
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!

Hugo Vellozo

Vellozo

unread,
Dec 5, 2009, 8:23:52 AM12/5/09
to ccppbrasil
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?

abs

Hugo Vellozo

Flavio Alberto Lopes Soares

unread,
Dec 5, 2009, 4:27:50 PM12/5/09
to ccppb...@googlegroups.com
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


2009/12/5 Vellozo <vel...@gmail.com>

Marcio Gil

unread,
Dec 6, 2009, 7:05:58 AM12/6/09
to ccppb...@googlegroups.com
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

Marcio Gil

unread,
Dec 6, 2009, 7:11:00 AM12/6/09
to ccppb...@googlegroups.com
A propósito, o trecho de código corrigido:
 
while (!feof(file_in))

{
  n = fread( buffer_in, 1, 512, file_in );
  for (i = 0, j = 0; i < n; ++i)
  {
    if (!strchr( ".,;!?", buffer_in[i] ))
      buffer_out[j++] = buffer_in[i];

  }
  if (j > 0)
    fwrite( buffer_out, 1, j, file_out );
}
 
 


From: Marcio Gil

Flavio Alberto Lopes Soares

unread,
Dec 7, 2009, 7:11:04 AM12/7/09
to ccppb...@googlegroups.com
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 ?

Sucesso !
Flávio Alberto Lopes Soares

2009/12/6 Marcio Gil <marci...@bol.com.br>

Vellozo

unread,
Dec 7, 2009, 12:50:33 PM12/7/09
to ccppbrasil
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 ?
>
> Sucesso !
> Flávio Alberto Lopes Soares
>
> 2009/12/6 Marcio Gil <marciom...@bol.com.br>
>
>
>
> >  A propósito, o trecho de código corrigido:
>
> > while (!feof(file_in))
>
> > {
> >   n = fread( buffer_in, 1, 512, file_in );
> >   for (i = 0, j = 0; i < n; ++i)
> >   {
> >     if (!strchr( ".,;!?", buffer_in[i] ))
> >       buffer_out[j++] = buffer_in[i];
>
> >   }
> >   if (j > 0)
> >     fwrite( buffer_out, 1, j, file_out );
> > }
>
> >  ------------------------------
> > *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
>
> > 2009/12/5 Vellozo <vell...@gmail.com>

Vellozo

unread,
Dec 9, 2009, 6:48:39 AM12/9/09
to ccppbrasil
fiz assim! Pois alem de tirar a os caracteres "indesejaveis" tinha que
passa as palavras pra maiusculas.


doc = fopen(arquivos[i],"r");

while (fgets(aux, 100, doc)!=NULL)
{
*palavra = (char*)strtok(aux," .,!?;\n");

while (*palavra != NULL)
{
tamanhoPalavra = strlen(*palavra);
strcpy(aux, *palavra);

for (j=0; j<tamanhoPalavra; j++) aux[j] = tolower(aux
[j]);

strcpy(*palavra, aux);
printf("Inserindo \"%s\"...\n",*palavra);

*palavra = strtok(NULL, " .,!?;\n");
Reply all
Reply to author
Forward
0 new messages