Escrever no início de um arquivo

Escrever no início de um arquivo

por Maurício Martins da Silva -
Número de respostas: 2
Olá, estou fazendo um programa em C que realiza alguns cálculos e joga os resultados em um arquivo texto (fopen e fprintf). A cada cálculo realizado, é incrementado um contador. No final de todos os cálculos, o contador deve obrigatoriamente vir na primeira linha desse arquivo texto.

O problema é que eu não sei como voltar a escrever na primeira linha (se eu der fopen de novo, ele destrói o arquivo original e cria um novo).

Pensei na possibilidade de criar um arquivo temporário apenas para os cálculos, depois eu crio o verdadeiro arquivo de saída com a linha de cabeçalho (com o contador) e então copio os resultados do arquivo temporário. Mas provavelmente deve existir um jeito mais inteligente de fazer isso. sorriso

PS: Isso não tem nada a ver com o EP3.
Em resposta à Maurício Martins da Silva

Re: Escrever no início de um arquivo

por Flavio Coutinho -
Oi Maurício,

tem uma forma de fazer o que você quer. Usando a função fseek você consegue definir manualmente a posição a partir da qual você vai começar a escrever no arquivo.

O único problema é que tudo o que for escrito usando fprintf vai sobreescrever o que já estiver no arquivo. Isto é, ao escrever algo no início arquivo, o conteúdo original NÂO é "empurrado" para o final. Mas se você reservar espaço no início do arquivo, então você pode voltar e escrever algo no inicio sem maiores problemas.

Abaixo segue um exemplo:

#include <stdio.h>

int main(){

FILE * file = fopen("blah.txt", "r+");

fseek(file, 2, SEEK_SET);
fprintf(file, "XY");
fclose(file);

return 0;
}

no caso, quando chamo a função fseek, estou dizendo que quero começar a escrever na posição distante 2 bytes em relação ao início do arquivo (que é a posição zero).

Veja o resultado de um simples teste usando o programa (que chamei de teste) compilado a partir do código acima:

flc@compy386:/tmp/teste$ echo "ABCDEF" > blah.txt
flc@compy386:/tmp/teste$ cat blah.txt
ABCDEF
flc@compy386:/tmp/teste$ ./teste
flc@compy386:/tmp/teste$ cat blah.txt
ABXYEF
flc@compy386:/tmp/teste$

Acho que com isso, você consegue resolver seu problema, só não esqueça de reservar o espaço necessário antes.

Em resposta à Flavio Coutinho

Re: Escrever no início de um arquivo

por Maurício Martins da Silva -
Obrigado Flavio. Era isso mesmo que eu queria.
Aliás, pesquisei o fseek no google e achei uma função no stdio.h "void rewind (FILE *arquivo)" que parece ser a mesma coisa que usar o fseek na posição 0.