Escrita em arquivo binário

Programação Visual Basic

Moderadores: 51, guest2003

Escrita em arquivo binário

Mensagempor MOR_AL » 16 Jun 2010 18:55

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Escrita em arquivo binário

Mensagempor Rodrigo_P_A » 16 Jun 2010 19:22

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" ?
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor MOR_AL » 16 Jun 2010 19:26

... No Windows Explorer. Duplo-clic no arquivo e .... WordPad com um monte de quadradinhos. :(
MOR_AL
Editado pela última vez por MOR_AL em 16 Jun 2010 19:30, em um total de 1 vez.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Rodrigo_P_A » 16 Jun 2010 19:29

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.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor MOR_AL » 16 Jun 2010 19:33

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor MOR_AL » 16 Jun 2010 19:45

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Rodrigo_P_A » 16 Jun 2010 19:47

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+
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor MOR_AL » 16 Jun 2010 19:50

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
Editado pela última vez por MOR_AL em 16 Jun 2010 20:10, em um total de 1 vez.
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Rodrigo_P_A » 16 Jun 2010 19:59

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
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor MOR_AL » 16 Jun 2010 20:13

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Rodrigo_P_A » 16 Jun 2010 20:17

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.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor MOR_AL » 16 Jun 2010 20:30

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor Rodrigo_P_A » 16 Jun 2010 20:32

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!
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2236
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil


Voltar para Visual Basic

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x