Ir para conteúdo
Fórum Script Brasil
  • 0

Simples - Função lê número mal num ficheiro binário


AccioOnion

Pergunta

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

typedef struct Pessoa
	{
		int cc;
		char nome[51];
		char partida[11];
		char chegada[11];
		short int dia;
	} PESSOA;	

int main()
{
	int i;
	FILE* fps = fopen("okb","rb");

	PESSOA passageiro;
 
  	if (fps == NULL) 
 	{
    	 	printf("Problemas na abertura do arquivo\n");
		exit(1);
  	}

	else
	{
 	
			fread (&passageiro.cc, 4, 1, fps);
			fread (passageiro.nome, 1, 51, fps);
			fread (passageiro.partida, 1, 11, fps);
			fread (passageiro.chegada, 1, 11, fps);
			fread (&passageiro.dia, 2, 1, fps);
  		
			printf("%d ", passageiro.cc);
			for(i = 0; i < 51; i++)
			{
				printf("%c", passageiro.nome[i]);
			}
			for(i = 0; i < 11; i++)
			{
				printf("%c", passageiro.partida[i]);
			}
			for(i = 0; i < 11; i++)
			{
				printf("%c", passageiro.chegada[i]);
			}
				printf("%hd\n", passageiro.dia);
	}
	
  
 	fclose(fps);
}

Boa noite, estava aqui a fazer um trabalho e deparei-me com isto e não consigo perceber o porquê da função não ler o que eu pretendo. Acho que deve ser algo bem simples mas como sou novo nisto não estou a conseguir detetar o que falha. É suposto esta função ler umas informações que estão num ficheiro em binário, o número do cc, nome da pessoa, local de partida e chegada do avião e dia do mês. Mas ao detetar o dia do mês a função em vez de escrever um número entre 1 - 30 escreve 256. Alguém percebe porquê?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Tenho umas perguntas que fazer antes de poder lhe ajudar.

1º O texto foi gerado por vc?
2º você possui o programa que gerou o arquivo?
3º Poderia postar o programa?
4º Seria possível compartilhar o arquivo binário também?
5º Em que sistema operativo foi gerado o arquivo? O arquivo foi gerado no mesmo computador?

Certamente o problema seja a causa do "alinhamento dos bytes" ou também conhecido como "byte aligne", e também o preenchimento de espaços(space padding), algo não transparente ao programador, mas algo que é levado a cabo pelos compiladores, digamos que a modo de otimização da velocidade na qual o programa se executa, mas sem essas informações não posso lhe dizer com 100% de precisão se o problema é esse.

Se quiser aprender sobre o tema de uma olhada aqui: https://0xc0de.wordpress.com/2008/10/31/alinhamento-alignment-e-preenchimento-padding/

Também poderia ser problema de bigendian ou litleendian se os dados foram gerados em outro computador, pois em diferentes sistemas operativos, a ordem dos bits muda. Em um computador a letra 'P' por exemplo poderia ser em binário 0101 0000, e em outro 0000 1010, o que quer dizer que está ao contrario um do outro evidentemente, por outro lado o computador ao receber os bits trocados, pode não saber interpretar bem os dados.

Mas como falei depende das perguntas que fiz acima.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...