Pessoal, estrou trabalhando com um cartão SD como base de dados de um dos meus sistemas.
Escrever dados, ler uma linha, ler variáveis no formato CSV, até aí tudo moleza.
Mas na hora de sobrescrever uma linha para atualizar os dados (não me interessa gerar uma nova linha, lembrando que não é um log), seja pelo Seek seguido de um Write ou de um Println, o texto vai pro final do arquivo.

rdfile.seekSet(getPosition(codigo));
rdfile.write(newLine); //atualiza Cod

o getPosition funciona... informo o Código, q é uma parte da String formada pelas linhas e ele me retorna o valor (contagem de bytes do arquivo) para posicionar o cursor no começo da linha de interesse.

E agora, posicionei o cursor, como escrevo(sobrescrevo) uma linha nesta posição?

Exibições: 1055

Responder esta

Respostas a este tópico

Eu não conheço ainda as bibliotecas SD do Arduino, chego lá..

Mas acredito que seu problema seja o mesmo que acontece em qualquer linguagem:

Quando vc abre um arquivo no modo texto delimitado por enter existem os comando open for read, open for write e open for append. E só.

Isso pq se vc quiser mudar uma linha no meio por ex, tirar um caracter, como o processador faria ??? O arquivo resultante teria que ser deslocado do ponto onde foi deletado até o final...

Vc pode até fazer isso "na unha", copiando o arquivo para um novo substituindo a linha, mas fica mto "I/O Bound" (programa que demora em função de I/O).

Acredito que existam 2 soluções:

- Mudar o sistema de escrita por um binário (records). Aih sim os dados são alinhados por um tamanho pré definido, assim vc pode escrever um bloco lá no meio do arquivo sem dificuldades.

- Escrever sempre no final, mas incluir um indice (um numero sequencial) junto ao dado, assim seu arquivo vai ficar imenso mas é possivel a qualquer momento (periodicamente) copia-lo para um novo preservando só o que interessa. Pelo indice vc sabe qual arquivo é mais novo.

Por isso os editores de texto só parecem fáceis de fazer... Salvo quando vc tem RAM suficiente (coisa que nunca acontece, já que a RAM cresce mas as imagens do usuário crescem mais ainda). Editores de texto costumam montar blocos de dados usando ponteiro (tamanho dinamico de linha) e ficam o tempo todo alocando e desalocando memória para cada linha. Quando vc dá um Load vem tudo na memoria de forma sequencial, mas basta vc acrescentar um caracter numa linha do meio pra ele dispensar a memoria alocada praquela linha e realocar uma maior lá no topo da memoria. O texto não é armazenado na sequencia. Quem define que linha deve ser apresentada primeiro é um indice que acompanha cada linha (invisível para o usuário).

É... estou tentando "na unha" mesmo.

Como o arquivo tem em torno de 300 Bytes, no máximo 1KB o "I/O Bound" ainda está tolerável. Mas pra aplicação final vou ter que trabalhar com os blocos da memoria flash (do SD no caso) se quiser manter desempenho.

Bom, na logica voce poderia definir aonde vai iniciar a linha do PRINT, tipo como fazemos com o lcd e o Serial.

Não sou bom em programação. Só estou dando uma pequena ideia. 

Não conheço muito sobre LIB SD.

Para definir aonde o elemento vai iniciar no lcd é definido como lcd.begin(16,2);

sim sim, isso é tranquilo.

Oque eu não queri era ter q ficar deslocando o arquivo, sobre pena de corromper o mesmo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço