Jump to content

Ler uma linha especifica de um ficheiro txt


Recommended Posts

Posted

Boas pessoal,

Eu gostava de saber se é possivel de alguma forma aceder a um ficheiro txt e começar um ciclo a partir de uma linha especifica.

Se eu tiver milhares de registos queria evitar a leitura linha-a-linha do ficheiro.

O objetivo é evitar consumir a memoria ram e mesmo em ficheiros de milhares de linhas conseguir aceder de uma forma "instantanea", imprescetivel, ao humano.

Cumprimentos

Leandro Rodrigues

Posted

para ser possível fazer o que pretendes necessitas de uma condição crucial (que normalmente não acontece em ficheiros de texto) : cada registo tem de ter o mesmo tamanho em bytes e esse tamanho ser conhecido.

caso contrário não existe nenhuma maneira de abrires um ficheiro e saltares para uma "linha" específica.

ficheiros são conhecidos como "streams", e como tal, não existe o conceito implícito de posição no meio destes. tens de ser tu a dar esse conceito. seja por saberes que cada elemento tem X bytes (podendo assim saltar para o elemento i através da conta X*i), ou vais lendo a "corrente de bytes" ("stream of bytes") até encontrares um byte (ou combinação de bytes) específico, como no caso de ficheiros de texto sendo o '\n' (ou '\r' ou uma combinação dos dois dependendo do SO que estás a usar)

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted

Bem estive agora a testar o fseek e ele é muito lento. Num ficheiro com 10000000 linhas ele demora imenso tempo a colocar o cursos na penultima linha. Existe uma solução mais rápida?

para ser possível fazer o que pretendes necessitas de uma condição crucial (que normalmente não acontece em ficheiros de texto) : cada registo tem de ter o mesmo tamanho em bytes e esse tamanho ser conhecido.

Infelizmente o mesmo tamanho é impossivel. Ou melhor nao é viavel.

O meu problema e que se o ficheiro contiver milhares ou milhoes de registos o feeback ao utilizador torna-se muito muito lento.

Posted (edited)

Boas,

Tenho uma pergunta pertinente para a elaboração do meu projeto.

Eu consigo alterar/apagar uma linha sem ter que fazer copia do ficheiro?

Eu consigo fazer p.ex ir ao byte 1 e simular o shift + end? Imaginemos o seguinte:

Dados no ficheiro .txt

Registo1

Registo2

Se eu agora quiser alterar o nome do Registo1 para Teste como faço? Ja pensei em usar o fseek mas não estou a ver como

Edited by Leudassdf
Posted (edited)

como te disse num outro tópico, um ficheiro não é mais do que uma sequência de bytes. se fores alterar os bytes Bi até Bn, podes fazer, mas tens de perceber que será sempre tu (a tua aplicação) que deverá fazer sentido dos bytes existentes no ficheiro.

exemplo:

se tiveres um ficheiro com o seguinte conteúdo:

12
34

não é mais do que um ficheiro com 5 bytes : 49, 50, 10, 51 e o 52

logo, é nesse contexto que tens de alterar os bytes, não existe maneira de "eliminar" ou "injectar" bytes num ficheiro, é um "stream" e é assim que tens de o tratar.

é por essa razão quando se abre um ficheiro com dados, é convencional guardar todos os dados em memória e gravar tudo de uma vez para o ficheiro quando necessário (normalmente no fecho da aplicação)

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

logo, é nesse contexto que tens de alterar os bytes, não existe maneira de "eliminar" ou "injectar" bytes num ficheiro, é um "stream" e é assim que tens de o tratar.

é por essa razão quando se abre um ficheiro com dados, é convencional guardar todos os dados em memória e gravar tudo de uma vez para o ficheiro quando necessário (normalmente no fecho da aplicação)

Nao percebi como posso alterar os bytes.

Sim a solução que me veio em primeiro a cabeça foi no final do programa gravar toda a informação no ficheiro.

No entanto se o ficheiro tiver milhares de linhas torna-se lento.

Posted

Nao percebi como posso alterar os bytes.

qualquer função *fprintf serve para alterar os bytes, assim como o fwrite

Sim a solução que me veio em primeiro a cabeça foi no final do programa gravar toda a informação no ficheiro.

No entanto se o ficheiro tiver milhares de linhas torna-se lento.

é por essa razão que não vez ficheiros de texto a guardar informação ...

IRC : sim, é algo que ainda existe >> #p@p
Posted

qualquer função *fprintf serve para alterar os bytes, assim como o fwrite

sim eu cheguei a fazer com o fputs no entanto so consegui meter espaços. no entanto o meu objetivo era mesmo eliminar os dados da linha de forma a que o registo inferior fosse para a linha superior

Posted

o que acabas de dizer não faz sentido.

o bloco de notas é uma aplicação, que na realidade é (ou era) muito má no que toca a abertura de ficheiro grandes.

Compreendo. Apenas pensei que se pudesse fazer algo assim.

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.