Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

1. Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

Reginaldo
rpmour

(usa Ubuntu)

Enviado em 13/11/2013 - 16:36h

Aee pessoal, estou gravando os dados em um arquivo em modo binario:

gravacao.write((char*)&bits,sizeof(bits)); Onde a variavel char "bits", foi modificada bit a bit, mas na hora de ler do arquivo usando leitura.read((char*)&caracter,sizeof(char)), a variavel char "caracter" tem o valor null, e quando abro com o Notepad++ aparece que tem NULL tambem.

Entao sempre tá lendo null. O que fazer?


  


2. Re: Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/11/2013 - 21:53h

Só com as chamadas de gravação e leitura não dá para apontar exatamente o problema. Que tal se você mostrar mais do código, incluindo a forma de abrir o arquivo, a formação do valor da variável que está sendo gravada e, talvez, eventuais outras interações que você faz com os objetos de arquivos?


3. Re: Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

Reginaldo
rpmour

(usa Ubuntu)

Enviado em 14/11/2013 - 02:27h


ofstream gravacao("arq1.huf", ios::binary|ios::app);
ifstream leitura("arq1.huf", ios::binary);


A variável bits é que no caso é a que estou gravando estou trabalhando nela bit-a-bit (espero) segue trecho no qual faço (ou tento) fazer a operação:

while(it<8)
{
if(buffer[it]=='1') {//buffer é do tipo char[9], e contem 0's e 1's
auxBits=0;
auxBits=auxBits<<(8-it);
bits=bits|auxBits;
}
it++;
}
gravacao.write((char*)&bits,sizeof(bits));


E depois que ler do arquivo tenho que tentar algo para "extrair" os bits um a um e jogar numa string para posterior uso.


4. Re: Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/11/2013 - 03:21h

rpmour escreveu:

A variável bits é que no caso é a que estou gravando estou trabalhando nela bit-a-bit (espero) segue trecho no qual faço (ou tento) fazer a operação:

while(it<8)
{
if(buffer[it]=='1') {//buffer é do tipo char[9], e contem 0's e 1's
auxBits=0;
auxBits=auxBits<<(8-it);
bits=bits|auxBits;
}
it++;
}
gravacao.write((char*)&bits,sizeof(bits));


E depois que ler do arquivo tenho que tentar algo para "extrair" os bits um a um e jogar numa string para posterior uso.


Achei o trecho acima muito curioso. Note que, ao encontrar um caráter '1' em buffer, você faz auxBits valer zero (não deveria ser um?), desloca todos esses bits zerados 8-it casas à esquerda (continua valendo zero) e faz um ou bit-a-bit de zero (ou seja, uma operação inócua) com um valor inicial (que você não mostrou, mas deveria ter mostrado -- mas eu suponho que ele também estava zerado) da variável bits.

Acho que seu laço de repetição ficaria mais simples do seguinte modo.

bits=0;
for(i=0; i<8; i++)
bits = (bits<<1) | (buffer=='1');
// Sim -- é só isso mesmo.


Você parece estar construindo um compressor de dados. Acho curioso que, no processo, esteja na verdade criando uma absurda expansão de dados por meio do array [i]buffer
, que armazena cada bit ocupando um byte inteiro. Já que você está usando C++, por que não utiliza std::bitset (em <bitset>) para guardar seus valores intermediários?


5. Re: Gravar/ Ler Arquivo Modo Binario [RESOLVIDO]

Reginaldo
rpmour

(usa Ubuntu)

Enviado em 14/11/2013 - 10:10h

Então deveria estar atribuindo para a variável auxBits=1, e só depois deslocando esse 1? Então no laço sempre que encontro 1 em buffer[it], faço, mas agora considere a auxBits=1, auxBits=auxBits<<(8-it), que seria 00000001<<(8-it) e ficaria 10000000, certo? E depois disse fazia uma operação "ou" com a variável bits=bits|auxBits; e se, por exemplo, bits for 00000000 | 10000000 resultaria em 10000000. Só estou fazendo isso quando aparecer 1 na variável buffer, porque com zero o resultado seria 0.

Você parece estar construindo um compressor de dados. Acho curioso que, no processo, esteja na verdade criando uma absurda expansão de dados por meio do array buffer, que armazena cada bit ocupando um byte inteiro.


E sim é um compressor de dados baseado no Código de Huffman. E quando ao armazenamento de cada bit em um byte, mas apenas na memória principal. E como o uso do bitset, seria bitset<tamanho> variavel; E poderia trabalha normalmente com essa variável, assim como uma de outro tipo?

Tenho outra pergunta, como passo, se possível, para uma outra função, o ponteiro para o arquivo "gravacao": ofstream gravacao("arq1.huf", ios::binary|ios::app)?







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts