Ir para conteúdo
Fórum Script Brasil
  • 0

Sobrescrever parte de arquivo


Diogoo

Pergunta

Bom dia,

eu estou tetando a horas sobrescrever uma parte de um arquivo utilizando a linguagem C. Quando eu utilizo o fopen com o parâmetro "a" ou "ab", ele adiciona uma parte nova. Quando eu uso "w" ou "wb" ele sobrescreve o texto todo... segue aqui uma das minhas tentativas:

char nome_arquivo[200];
    int num;
    char letras[3];
    int tamanho;
    int bloco = 1;

    FILE *fp;
    strcpy(nome_arquivo,"C://teste.txt");
    strcpy(letras,"011");
    fp = fopen(nome_arquivo,"w");
    if (fp == NULL){
       printf("Falha ao abrir o arquivo ");
    }else{
       printf("Funcionou \n");
    }
    tamanho = strlen(letras);
    fseek(fp,3*(bloco-1),SEEK_SET);
    num = fwrite(letras,sizeof(char),tamanho,fp);
    printf("-:> %d",num);
    fclose(fp);

PS: Estou precisando muito dessa resposta...

Atc,

Diogo

Editado por Diogoo
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

[Ark]

Obrigado pela idéia ;), mas acho que se eu tiver um arquivo muito grande e for fazer uma cópia alterando apenas 1024 bytes no caso vai ficar muito pesado. A idéia é criar um cliente/servidor p2p para a transferência de um arquivo em partes.

[\Ark]

[beraldo]

Se essa for realmente a única solução, acho que isso será um "gargalo" muito grande, pois eu utilizarei esse escrita parcial de um arquivo constantemente

[\Beraldo]

Eu andei pesquisando e vou tentar apagar a parte do arquivo que quero modificar e após isso eu irei escrever no modo "a"...

Vocês já tentaram isso? Funciona?

atc,

Diogo

Editado por Diogoo
Link para o comentário
Compartilhar em outros sites

  • 0
Eu andei pesquisando e vou tentar apagar a parte do arquivo que quero modificar e após isso eu irei escrever no modo "a"...

Vocês já tentaram isso? Funciona?

Em sistemas Unix, há a função truncate(). Ela trunca o arquivo, retirando um número de bytes do final dele.

Apesar de não se explicitar a reescrita do arquivo, essa função faz isso internamente.

Eu tive a mesma dúvida: deve haver uma forma de não reescrever o arquivo. Pesquisei por uma semana e não achei nada. Se você achar, poste aqui pois quero usar também.

O que você pode fazer é mover os bytes do fim do arquivo para a parte do arquivo que deseja apagar. Depois apague o fim do arquivo.

Por exemplo:

arq.bin

linha1
linha2
linha3
linha4
Quero apagar a linha 2. Logo: [code linha 1 linha 4 linha 3 AQUI ESTAVA A LINHA 4, MAS FOI REMOVIDA

Link para o comentário
Compartilhar em outros sites

  • 0
Eu andei pesquisando e vou tentar apagar a parte do arquivo que quero modificar e após isso eu irei escrever no modo "a"...

Vocês já tentaram isso? Funciona?

Em sistemas Unix, há a função truncate(). Ela trunca o arquivo, retirando um número de bytes do final dele.

Apesar de não se explicitar a reescrita do arquivo, essa função faz isso internamente.

Eu tive a mesma dúvida: deve haver uma forma de não reescrever o arquivo. Pesquisei por uma semana e não achei nada. Se você achar, poste aqui pois quero usar também.

O que você pode fazer é mover os bytes do fim do arquivo para a parte do arquivo que deseja apagar. Depois apague o fim do arquivo.

Por exemplo:

arq.bin

linha1
linha2
linha3
linha4
Quero apagar a linha 2. Logo:
[code linha 1 linha 4 linha 3 AQUI ESTAVA A LINHA 4, MAS FOI REMOVIDA
Mas o problema está exatamente nesse "mover os bytes do fim para o meio", porque quando eu faço isso ele está rescrevendo o arquivo apenas com essa parte que eu removir, mesmo que eu faça um fseek para a posição... Essa solução de remover uma parte do arquivo eu só tive por causa desse outro problema. Na verdade o programa já vai alocar o arquivo com o tamanho correto, só tendo que alterar os dados invalidos posteriormente com dados reais... como feito no torrent... Se você souber como substituir essa "linha2" pela "linha4" já resolveria meu problema. Exemplo:
linha1
linha2
linha3
linha4

\/ \/ \/   

linha1
linha4
linha3
linha4

Atc,

Diogo

Editado por Diogoo
Link para o comentário
Compartilhar em outros sites

  • 0
tem que manipular os bytes

use fwrite()

Veja:

http://forum.imasters.uol.com.br/index.php...=311072&hl=

Quanto eu testei utilizando o "ab" na abertura do arquivo ele me retornou a seguinte informação:

linha1
linha2
linha3
linha4

//////////////////////////

trocar a linha 2 pela mesma informação da linha 4 usando "ab"

linha1
linha4
linha2
linha3
linha4

/////////////////////////

mas na verdade o que eu queria era

linha1
linha4
linha3
linha4

///////////////////////

se eu uso o "w" ele faz

------
linha4

Editado por Diogoo
Link para o comentário
Compartilhar em outros sites

  • 0
Teste de novo com o modo "r+b"

Se não der certo, poste o código.

FUNCIONOU!!!

VLW cara!

eu me matando para tentar sobrescrever e funciona com "r+b".. :D

Tenho um trabalho para amanhã com isso e iria fazer uma função para carregar em outro arquivo modificando os bits, como tinham falado anteriormente...

Muito Obrigado Beraldo

Atc,

Diogo

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...