Página 1 de 1

Escrita em arquivo binário

MensagemEnviado: 16 Jun 2010 18:55
por MOR_AL
Olá pessoal.
Estou tendo problemas em gravar bytes em arquivo binário.
Fiz o seguinte códico, mas ele grava todos os bytes com o valor nulo (acho).
Quando debugo o programa, na escrita para o arquivo, o dado assume os valores normais na instução Put, mas quando leio com a intrução Get, os dados lidos são nulos.
Quando abro o arquivo gerado (Lixo.dat) através do Windows Explorer, ele possui o número de caracteres esperados, porém todos com o símbolo de um quadradinho.
Segue uma fração do código:
Código: Selecionar todos
                No = FreeFile()       ' Identifico o número do arquivo livre. Como no meu caso tem um arquivo só, poderia ser 1.
                Open CommonDialog1.FileName For Binary As #No
                For i = 1 To 10000 Step 2 ' Teste para escrever no arquivo.
                    Put #No, i, 2
                    ys = Int(i / 10)
                    Put #No, i + 1, ys
                Next i

As variáveis i e ys estão dimensionadas como "Dim i As Integer, ys As Single" e a variável "No" como "No As Byte"
CommonDialog1.FileName assume "C:\Lixo.dat"; o que é o esperado.
"No" assume o número 1; também esperado.
Nos endereços ímpares (i = 1, 3, 5, ...) estou gravando o valor 2.
Nos endereços pares (i = 2, 4, 6, ...) estou gravando o valor inteiro de i / 10.
Os valores de todas as variáveis estão corretos, como esperado, mas o que está sendo visto no arquivo são quadradinhos.
O que está sendo recuperado do arquivo são zeros.
Já não sei mais onde procurar pelo erro.

MOR_AL

Re: Escrita em arquivo binário

MensagemEnviado: 16 Jun 2010 19:22
por Rodrigo_P_A
MOR_AL escreveu:Olá pessoal.
Estou tendo problemas em gravar bytes em arquivo binário.
Fiz o seguinte códico, mas ele grava todos os bytes com o valor nulo (acho).
Quando debugo o programa, na escrita para o arquivo, o dado assume os valores normais na instução Put, mas quando leio com a intrução Get, os dados lidos são nulos.
Quando abro o arquivo gerado (Lixo.dat) através do Windows Explorer, ele possui o número de caracteres esperados, porém todos com o símbolo de um quadradinho.
Segue uma fração do código:
Código: Selecionar todos
                No = FreeFile()       ' Identifico o número do arquivo livre. Como no meu caso tem um arquivo só, poderia ser 1.
                Open CommonDialog1.FileName For Binary As #No
                For i = 1 To 10000 Step 2 ' Teste para escrever no arquivo.
                    Put #No, i, 2
                    ys = Int(i / 10)
                    Put #No, i + 1, ys
                Next i

As variáveis i e ys estão dimensionadas como "Dim i As Integer, ys As Single" e a variável "No" como "No As Byte"
CommonDialog1.FileName assume "C:\Lixo.dat"; o que é o esperado.
"No" assume o número 1; também esperado.
Nos endereços ímpares (i = 1, 3, 5, ...) estou gravando o valor 2.
Nos endereços pares (i = 2, 4, 6, ...) estou gravando o valor inteiro de i / 10.
Os valores de todas as variáveis estão corretos, como esperado, mas o que está sendo visto no arquivo são quadradinhos.
O que está sendo recuperado do arquivo são zeros.
Já não sei mais onde procurar pelo erro.

MOR_AL


onde vc está visualizando o arquivo que ele mostra "quadradinhos" ?

MensagemEnviado: 16 Jun 2010 19:26
por MOR_AL
... No Windows Explorer. Duplo-clic no arquivo e .... WordPad com um monte de quadradinhos. :(
MOR_AL

MensagemEnviado: 16 Jun 2010 19:29
por Rodrigo_P_A
MOR_AL escreveu:... No Windows Explorer. Duplo-clic no arquivo e .... um monte de quadradinhos. :(
MOR_AL


essa eu num entendi, faça o seguinte ( por favor ):

baixe este programa: http://www.winhex.com/winhex/

E então abra o seu arquivo gerado nele, dessa forma você poderá ver os bytes gravados e conferir se o problema é na escrita ou se é na leitura ou escrita do teu programa.

me explica como você está abrindo no windows explorer pq eu ainda num entendi.

MensagemEnviado: 16 Jun 2010 19:33
por MOR_AL
Vou baixar o programa.
Meu arquivo possui extensão .dat (por opção minha).
Eu editei minha última postagem e o arquivo é aberto através do WordPad.
Grato Rodrigo.
Daqui a pouco eu volto.
MOR_AL

MensagemEnviado: 16 Jun 2010 19:45
por MOR_AL
Rodrigo.
Baixei o programa e abri o arquivo.
A instrução Put #No, i, 2 grava o número 2 nos endereços ímpares (pares no arquivo, pois inicia no endereço zero). Isso está correto.
Já a instrução seguinte:

Put #No, i + 1, Int(i / 10)

Está gravando apenas zero (00) nas posições. Será que não se pode colocar uma expressão como valor [Int(i / 10)] a ser gravado?

Acho que para arquivos binários eu TENHO que colocar a extensão .HEX, né?! :oops:
Desculpe a minha falha, mas é que é a primeira vez que faço isso.
Só gostaria de entender porque a segunda instrução não está gravando o valor correto.
Você tem idéia?
Grato pelo seu auxílio.
MOR_AL

MensagemEnviado: 16 Jun 2010 19:47
por Rodrigo_P_A
MOR_AL escreveu:Vou baixar o programa.
Meu arquivo possui extensão .dat (por opção minha).
Eu editei minha última postagem e o arquivo é aberto através do WordPad.
Grato Rodrigo.
Daqui a pouco eu volto.
MOR_AL


cara, tu tá cometendo um erro hehe,

vamos lá, Word pad é para visualizar arquivos de texto, e não arquivo binário, abra no WinHex que vc vai entender o que eu digo.

o Wordpad mostra caracteres imprimíveis da tabela ASCII e não dados de arquivos binários.

você está gravando dados binários no arquivo, então vc tem que usar outro tipo de programa, do tipo Winhex que eu indiquei para ver os "bytes" dentro do arquivo, dá uma olhada e posta aqui.

t+

MensagemEnviado: 16 Jun 2010 19:50
por MOR_AL
Pôxa, estamos "on line" porém sem sincronismo! Veja a minha postagem anterior.

Editado:

Rodrigo ... funcionou.
Meus erros:
Abria o arquivo duplo-clicando sobre ele no Windows explorer. Isso fazia abrir com o WordPad. Com a sua indicação, pude visualizar o arquivo e constatei que já estava funcionando em parte.
Para funcionar a segunda parte, eu simplesmente apaguei e redigitei a instrução. Aí pude ver os valores corretos via o software indicado por você.
Valeu Rodrigo.
Grande abraço.
MOR_AL

MensagemEnviado: 16 Jun 2010 19:59
por Rodrigo_P_A
MOR_AL escreveu:Rodrigo.
Baixei o programa e abri o arquivo.
A instrução Put #No, i, 2 grava o número 2 nos endereços ímpares (pares no arquivo, pois inicia no endereço zero). Isso está correto.
Já a instrução seguinte:

Put #No, i + 1, Int(i / 10)

Está gravando apenas zero (00) nas posições. Será que não se pode colocar uma expressão como valor [Int(i / 10)] a ser gravado?

Acho que para arquivos binários eu TENHO que colocar a extensão .HEX, né?! :oops:
Desculpe a minha falha, mas é que é a primeira vez que faço isso.
Só gostaria de entender porque a segunda instrução não está gravando o valor correto.
Você tem idéia?
Grato pelo seu auxílio.
MOR_AL


vamos lá, seguinte, a extensão do arquivo num tem nada a ver com o formato dele, a extensão serve só para o "Windows" saber com qual programa abrir determinado tipo de arquivo, só pra isso.

se vc quer ver o arquivo gerado em arquivo de texto, vc deve criar usando caracteres ascii, por exemplo:

put #No,i+1 , chr( "1" )

vai gravar o caractere "1" no arquivo, que equivale ào número: 0x31 e não 0x01 como vc está gravando.

faz tempo que eu num uso vb, mas o que deve estar acontecendo é que a instrução PUT grava só um byte

put #no, POSICAO, dado

dado deve ser byte, se o valor em i é maior que 255, o valor deve estar sendo truncado, igual operação lógica, outra coisa é, se o a divisão não for inteira, vai retornar 0x00 e isso será gravado

veja, a instrução put e get lê e escreve bytes: http://www.vb6.us/tutorials/reading-and ... sual-basic

MensagemEnviado: 16 Jun 2010 20:13
por MOR_AL
Ok.
Rodrigo.

Estou gravando bytes mesmo. São valores a serem enviados para o PC, via serial.
Entendi tudo agora e já está funcionando (pelo menos esse trecho do programa).
MOR_AL

MensagemEnviado: 16 Jun 2010 20:17
por Rodrigo_P_A
MOR_AL escreveu:Ok.
Rodrigo.

Estou gravando bytes mesmo. São valores a serem enviados para o PC, via serial.
Entendi tudo agora e já está funcionando (pelo menos esse trecho do programa).
MOR_AL


blz,

pq vc num usa o Vb.Net? o Vb6 num vai ter mais suporte e o Vb.Net na minha opnião é melhor.

MensagemEnviado: 16 Jun 2010 20:30
por MOR_AL
Eu já comentei em outro tópico.
Segue resposta!

Olá!
Retorno para dar uma satisfação ao pessoal que me orientou neste tópico.
1 - Independentemente de qual software seja melhor (Basic, C, etc.), eu estou mais familiarizado com o Basic, porque comecei com ele há mais de 30 anos.
2 - Profissionalmente, minha área era eletrônica analógica, sequencial, combinacional e tudo dessa área. Não uso e nem usei essa e outras linguagens. Apenas o assembler com o 8085, e em apenas um projeto.
3 - Como hobby, usava o QBasic para calcular meus projetinhos. Apesar de que alguns não serem nada simples. Com o advento do Windows, tive que migrar para outro software. Nada mais natural que passar para o VB6 porque é bem parecido com o QBasic.
4 - Como trabalhos didáticos, usei o QBasic para uma apresentação de uma onda de ultrasom no tempo e no espaço, e também migrei para o MatLab, para alguns cálculos mais complexos. A linguagem também é muito parecida com o Basic.
Por todas essas razões, é que continuo com o Basic e ele tem resolvido os meus problemas sem ter que dedicar muito mais tempo aprendendo uma linguagem diferente.
Apesar desse fato, estou estudando, apenas por estudar, e seguindo parte da sugestão do Rodrigo, a continuidade do VB6, o Visual Basic Express Edition, que possui alguma semelhança com o VB6. O VB.Net continua em meus planos...

Um abraço a todos.
MOR_AL

MensagemEnviado: 16 Jun 2010 20:32
por Rodrigo_P_A
MOR_AL escreveu:Eu já comentei em outro tópico.
Segue resposta!

Olá!
Retorno para dar uma satisfação ao pessoal que me orientou neste tópico.
1 - Independentemente de qual software seja melhor (Basic, C, etc.), eu estou mais familiarizado com o Basic, porque comecei com ele há mais de 30 anos.
2 - Profissionalmente, minha área era eletrônica analógica, sequencial, combinacional e tudo dessa área. Não uso e nem usei essa e outras linguagens. Apenas o assembler com o 8085, e em apenas um projeto.
3 - Como hobby, usava o QBasic para calcular meus projetinhos. Apesar de que alguns não serem nada simples. Com o advento do Windows, tive que migrar para outro software. Nada mais natural que passar para o VB6 porque é bem parecido com o QBasic.
4 - Como trabalhos didáticos, usei o QBasic para uma apresentação de uma onda de ultrasom no tempo e no espaço, e também migrei para o MatLab, para alguns cálculos mais complexos. A linguagem também é muito parecida com o Basic.
Por todas essas razões, é que continuo com o Basic e ele tem resolvido os meus problemas sem ter que dedicar muito mais tempo aprendendo uma linguagem diferente.
Apesar desse fato, estou estudando, apenas por estudar, e seguindo parte da sugestão do Rodrigo, a continuidade do VB6, o Visual Basic Express Edition, que possui alguma semelhança com o VB6. O VB.Net continua em meus planos...

Um abraço a todos.
MOR_AL


então, na verdade o Vb.Net é o VB6 "novo" e com recursos à mais, a linguagem é basic.

bom, o importante é estudar, se vc pegar o jeito no vb6 fica fácil pra vc migrar para o Vb.Net.

até +

bom estudo!