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.
From: Flavio Alberto Lopes Soares
From: Marcio Gil