Jump to content
Ang3lo

Alterar dados ficheiro

Recommended Posts

Ang3lo

Boa tarde a todos ;)

Tenho um problema que não sei como resolver, como apenas posso usar as chamadas ao sistema para trabalhar com ficheiros,

como o open, writre e read não como fazer isto:

Tenho que registar num ficheiro txt o numero de vezes que um utilizador passa numa porta.

Vou ter um ficheiro com vários utilizadores e sempre que ele passar na porta tenho de ir ao ficheiro e incrementar.

Agora a minha duvida é como é que devo fazer isto?

Ja pensei em ler a linha onde o utilizador se encontra e incremento o valor

e volto a escrever no ficheiro. Mas deste modo fico com duas linhas para o mesmo utilizador o que não pode ser e não sei

como se apaga um determinada linha no ficheiro.

Outra seria apenas incrementar o valor no ficheiro.

Existe algum modo de fazer isto? :\

Obrigado

Share this post


Link to post
Share on other sites
KTachyon

FILE *fd = fopen("filename.txt", "w");

"w" Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.

;)

EDIT: Percebi mal.

Basicamente, abres o ficheiro e armazenas toda a informação em structs. Fazes o que tens a fazer e gravas o ficheiro de novo com toda a informação que tens nas structs.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Ang3lo

Mas não há outra maneira que estar a carregar o ficheiro todo para memoria alterar apenas um campo e voltar a carregar tudo para ficheiro novamente?

Fogo ate a bash tem um comando que faz isso.. ;P

Porque se o ficheiro tiver muito utilizadores ainda vai demorar um bocado e sempre que passa um ter utilizador tenho de carregar tudo pode ser um problema não?

Share this post


Link to post
Share on other sites
KTachyon

Pah, o problema é o seguinte: Quando vais escrever no ficheiro o espaço ocupado pelos dados é fixo. Ou seja, se num determinado local precisas de substituir um byte por dois bytes, todo o ficheiro fai ter que ser reescrito a partir desse byte.

Agora, se tu conseguires garantir que tens sempre espaço (por exemplo, escrevendo 00001 de modo a que possas ir fazendo replace aos zeros quando a variável passa a dois dígitos), podes brincar com o acesso binário a ficheiro, com

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

Mas depois tens que brincar com o fseek para poderes posicionar o ponteiro do ficheiro:

fseek(f, 5, SEEK_CUR);
fwrite("2", 1, 1, f);


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Ang3lo

Parece interessante essa solução, vou tentar fazer desse modo a ver se consigo atingir o meu objectivo ;)

Share this post


Link to post
Share on other sites
Ang3lo

É possível eliminar uma linha dum ficheiro?

Aluno1 | 2

Aluno2 | 3

Aluno4 | 4

E ficar assim depois

Aluno1 | 2

Aluno4 | 4

Share this post


Link to post
Share on other sites
KTachyon

Pois, isso leva exactamente ao problema que coloquei anteriormente. Ao apagares, toda a informação que está no ficheiro à frente do que apagaste tem que ser movida para trás.

Tens algumas hipóteses:

1. Ler o ficheiro, alterar o que pretendas e substituir o conteúdo do ficheiro com as alterações.

2. Escrever noutro ficheiro, apagar o anterior e renomear o novo.

3. Arranjares forma de manter a linha com o espaço original, mas com um placeholder. Isso obriga-te a ter em consideração o espaço máximo de cada linha e estruturar o ficheiro de forma a que todas as linhas ocupem esse exacto espaço.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

O meu conselho é que nunca trabalhes com os ficheiros directamente porque isso vai-te dar problemas de certeza. O melhor mesmo é passares tudo para dentro do "scope" do teu programa e depois reescreveres tudo para o ficheiro, alterado, tal como o KTachyon disse.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.