Ir ao conteúdo
  • Cadastre-se

Arquivo bin: leitura e manipulação.


Auro

Posts recomendados

Olá, preciso implementar um programa em C que lê de um arquivo binário um vetor de unsigned int's, porém, não sei a quantidade de elementos nem nada, pesquisei sobre as funções ftell e fseek, mas ainda estou confuso, gostaria que alguém me desse uma luz sobre tal coisa.

 

Coloquei o exemplo de código que estou tentando desenvolver, basicamente, ler o vetor, fazer sua inversão e pegar um dígito especifico de cada número, a lógica do problema está sanada, porém não consigo ler o vetor.

 

Agradeço desde já.

t3.c

Link para o comentário
Compartilhar em outros sites

Tudo isso depende muito de como foi gravado esse tal arquivo binario, pois dependendo da função e formas utilizadas para escreve-lo você tem um arquivo que contem unsigned ints tal como você falou ou pode que você tenha simples strings(chars), veja o exemplo a seguir:

 

Execute o seguinte programa e abra o arquivo gerado. Nesse arquivo você possivelmente não verá nada, ou verá coisas "sem sentido", pois dentro dele contem inteiros, se averiguar o tamanho do arquivo você terá 8 Bytes, ou seja, dois inteiros de quatro bytes, mas lhe aseguro que seus inteiros estão aí, só que em tipo inteiro tal como ele seria representado na memoria ram, ele está em binario.

#include <stdio.h>
#include <stdlib.h>

struct Dados{
    unsigned int n;    
}d;

int main() {
    struct Dados dados[2] = {{3400}, {10}};

    
    FILE *file;    
    file = fopen( "arquivo_com_inteiros.txt", "wb"); 
    if(!file) {
       perror("Erro: ");
       return 1;
    }
    
    fwrite( dados, sizeof(struct Dados), 2, file);
    
    fclose(file);
    return ;
}

Entendeu?

Agora vamos com outro exemplo, strings...

#include <stdio.h>
#include <stdlib.h>

struct Dados{
    unsigned int n;    
}d;

int main() {
    char dados[10]="3400";
    
    FILE *file;    
    file = fopen( "arquivo_com_inteiros.txt", "wb"); 
    if(!file) {
       perror("Erro: ");
       return 1;
    }
    
    fwrite( dados, sizeof(struct Dados), 1, file);
    
    fclose(file);
    return ;
}

Agora nesse caso você verá um simples string "3400", o tamanho do arquivo será o tamanho em bytes que tem essa string, nesse caso 4 bytes, se enviamos algo como "Alo mundo!" teremos 10 bytes, no caso anterior se tratava de dois inteiros sem sinal, qualquer numero que escrevemos nele teria o mesmo tamanãoo de 4Bytes multiplicado por dois inteiros, porém em um string você teria varios chars, e cada char tem o tamanho de de 1Byte, por eso en la frase "Alo mundo!" você tem 10 chars contando letras, espaços em branco symbolos etc. Por essa razão é que digo que o arquivo em questão é estão importante quanto sua duvida, sempre que tiver alguma melhor você enviar o tal arquivo adjunto, pois assim será dado uma melhor resposta.

Por que tudo isso que foi dito é importante? Porque dependendo de como está o arquivo teremos que reservar memoria de uma forma ou de outra, a primeira forma tratase de enviar um "troço" de memoria ao arquivo, isso respeita os tipos de dados, ja na segunda forma você estaria ocupando bytes por char por tratar-se de strings, dai não adianta usar ftell para que te diga quantos inteiros você terá nesse arquivo por que um string "3400" terá 4bytes porém tratase de um string. Que acontece si no arquivo tenho "10034423423"? Pois que ja não seria 4 bytes. Certo? Seriam 11 Bytes você não pode usar isso para reservar um unsigned int, Si nesse arquivo você tiver algo como 12331123 322 3213123 332121235645 1236453241.... o que você tem nesse arquivo é um bonito string com palavras separadas por espaços, nesse caso lhe aconselharia ver quantos espaços tem para saber quantos inteiros você tem nesse arquivo, por outro lado se o arquivo for como no primeiro exemplo então você teria 4Bytes multiplicado pela quantidade de variáveis enviada ao arquivo, nesse caso ftell é perfeito para ler isso, é só dividir o valor retornado por ftell pelo tamanãoo do dado, isso te retornaria o numero de variáveis que contem o arquivo, caso contrario lhe recomendo ler como string reservando a mesma quantidade de bytes do arquivo.

 

Espero não ter te complicado a cabeça demais, para saber que tipo de arquivo você tem basta abri-lo, se você tem um string que possa averiguar claramente a simples vista então você deveria trata-lo como string, si você ver texto misturado com letras estranhas e com longos espaços, sem saltos de linha, então certamente você tem dados de todos os tipos como misturado, isso é a representação de um "pedaço" de memoria RAM que foi enviado ao arquivo, nesse caso você teria que saber a estrutura tal como foi enviada ao arquivo, pois você terá que reservar memoria para o arquivo do mesmo modo, por exemplo, si você enviou 2 int, 1 string e um double você teria que ler 2 int, 1 string e um double intercaladamente até terminar o file, como falei nesse caso se respeita tipos, por isso é necesario que você descreva como é o arquivo para poder ter uma melhor ajuda. 

 

Sorte!

 

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!