Leudassdf Posted February 17, 2014 at 05:48 PM Report #545581 Posted February 17, 2014 at 05:48 PM 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
thoga31 Posted February 17, 2014 at 05:49 PM Report #545583 Posted February 17, 2014 at 05:49 PM Vê a função fseek 😉 Knowledge is free!
HappyHippyHippo Posted February 17, 2014 at 06:14 PM Report #545587 Posted February 17, 2014 at 06:14 PM 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) 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 17, 2014 at 10:13 PM Author Report #545617 Posted February 17, 2014 at 10:13 PM 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.
HappyHippyHippo Posted February 17, 2014 at 10:17 PM Report #545618 Posted February 17, 2014 at 10:17 PM O meu problema e que se o ficheiro contiver milhares ou milhoes de registos o feeback ao utilizador torna-se muito muito lento. é por isso que se usa memory mapped files ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 17, 2014 at 10:39 PM Author Report #545620 Posted February 17, 2014 at 10:39 PM é por isso que se usa memory mapped files ... vou procurar a ver se consigo descobrir como se pode usar... Conheces algum site...?
Leudassdf Posted February 18, 2014 at 11:21 AM Author Report #545657 Posted February 18, 2014 at 11:21 AM (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 February 18, 2014 at 03:34 PM by Leudassdf
Leudassdf Posted February 18, 2014 at 10:09 PM Author Report #545734 Posted February 18, 2014 at 10:09 PM Ninguem consegue ajudar nesta situação?
HappyHippyHippo Posted February 18, 2014 at 10:39 PM Report #545742 Posted February 18, 2014 at 10:39 PM (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 February 18, 2014 at 10:40 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 18, 2014 at 10:48 PM Author Report #545745 Posted February 18, 2014 at 10:48 PM 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.
HappyHippyHippo Posted February 18, 2014 at 10:50 PM Report #545746 Posted February 18, 2014 at 10:50 PM 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 Portugol Plus
Leudassdf Posted February 18, 2014 at 10:57 PM Author Report #545748 Posted February 18, 2014 at 10:57 PM 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
HappyHippyHippo Posted February 18, 2014 at 11:00 PM Report #545750 Posted February 18, 2014 at 11:00 PM não existe maneira de "eliminar" ou "injectar" bytes num ficheiro IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 18, 2014 at 11:44 PM Author Report #545754 Posted February 18, 2014 at 11:44 PM Eu percebo o que queres dizer. apenas me faz confusao não conseguirmos eliminar tal como fazemos quando editamos o documento pelo bloco de notas. Devia ser possivel simular backspaces p.ex
HappyHippyHippo Posted February 19, 2014 at 04:47 AM Report #545762 Posted February 19, 2014 at 04:47 AM 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. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Leudassdf Posted February 19, 2014 at 10:16 AM Author Report #545769 Posted February 19, 2014 at 10:16 AM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now