Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KaioOliveira

na leitura de Binários

Recommended Posts

Bem estou com problemas para ler o arquivo binário no meu programa...

 

/*
O acervo de uma biblioteca precisa ser informatizado. Para tanto, as principais informações das obras
foram assim estruturadas:
Obra (número do tombo, número do exemplar, data da compra);
Tombo (número do tombo, nome da obra, nome do autor, nome da editora, código da área)
Elabore um programa em que seja definido um menu com as seguintes opções:
-> Cadastrar tombos
-> Cadastrar obras
-> Mostrar obra por área
-> Mostrar obras por autor
-> Mostrar obra por editora
-> Encerrar programa
Obs.: Existem três áreas: 1 - Exatas, 2 - Humanas e sociais, 3 - Biomédicas.*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define TAM_AUTOR 50
#define TAM_OBRA 50
#define TAM_EDIT 50

int Cod_areasg;

typedef struct
	{
		int ntombo, exemplar, mesc, diac, anoc; /*ntombo -> Numero do Tombo / datac -> Data de compra */
		char nobra [TAM_OBRA];
	}Obra;

typedef struct
	{
		int ntombo, carea; /*ntombo -> Numero do Tombo / carea -> Código da Aréa */
		char autor [TAM_AUTOR], obra [TAM_OBRA], editora [TAM_EDIT];
	}Tombo;

void leTombo(FILE *cadastrotombo, Tombo *a)
{
   fread((char *)a, sizeof(Tombo),1,cadastrotombo);
}

void Erro_encerra(char *mensagem)
{
   puts(mensagem);
   system("PAUSE");
   exit(0);
}

int qtdeLinhas(FILE *cadastrotombo)  //Conta marcas de 'fim_de_linha' do arquivo de caracteres
{
   int n = 0;
   char c;
   rewind(cadastrotombo);
   while((c=getc(cadastrotombo))!=EOF) if(c=='\n')n++;
   rewind(cadastrotombo);
   return n;
}

void LeImpr ()  {
   int retorno, cont = 0;
   //struct Tcliente Vcli;
   Tombo umTombo;
FILE *cadastrotombo = 0;
		cadastrotombo = fopen("tombos.dat","rb+");
		if((cadastrotombo = fopen("tombos.dat","rb+"))==NULL)
		Erro_encerra("erro na abertura de 'tombos.dat'");
   retorno = fread(&umTombo, sizeof(Tombo), 1, cadastrotombo);
   // fread retorna a quantidade de itens retornados ...
   system("CLS");
   while ( retorno == 1) {
	  cont++;
		 	printf ("Tombo: %d\n", umTombo.ntombo);
			  printf ("Obra: %s\n", umTombo.obra);
			  printf ("Autor: %s\n", umTombo.autor);
			  printf ("Editora: %s\n\n", Tombo.editora);
	  retorno = fread(&umTombo, sizeof(Tombo), 1, cadastrotombo);

   }
   printf(" \n\n %d obras ", cont);
   getch();
}


/*void MostraRegistro(int x)
	{
		Tombo umTombo;
		FILE *cadastrotombo;
		cadastrotombo = fopen("tombos.dat","rb+");
		if((cadastrotombo = fopen("tombos.dat","rb+"))==NULL)
		Erro_encerra("erro na abertura de 'tombos.dat'");
		do{
			fseek( cadastrotombo, 0, SEEK_SET );
		 	printf ("Tombo: %d\n", umTombo.ntombo);
			  printf ("Obra: %s\n", umTombo.obra);
			  printf ("Autor: %s\n", umTombo.autor);
			  printf ("Editora: %s\n\n", umTombo.editora);
			  system("PAUSE>>null");
			  }


   			while(fread( &umTombo, sizeof( Tombo ), 1, cadastrotombo ));


	 	  }*/

void carea() //carea = Consulta Area
{
	 int a;
	 FILE *cadastrotombo;
	 cadastrotombo=fopen("tombos.dat", "rb");
	 printf("Digite 1 Para Exatas\n");
	 printf("Digite 2 Para Humanas e Sociais\n");
	 printf("Digite 3 Para Biomedicas\n");
	 printf("Sua Opcao: ");
	 scanf("%d", &a);
	switch(a){
				case 1:{
					 		 system("CLS");
							 printf("\t\t\->MOSTRANDO OBRAS POR AREA<- \n");
							 printf("\t\t\t->EXATAS<- \n\n");
							 LeImpr();
							 printf("\n\n >>>>PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU ANTERIOR<<<<");
							 system("pause>>NULL");
							 }
							 break;


					 case 2:{
					 		 system("CLS");
							 printf("\t\t\	>>MOSTRANDO OBRAS POR AREA<< \n");
							 printf("\t\t\t >>HUMANAS E SOCIAIS<< \n\n");
							 //MostraRegistro(2);
							 printf("\n\n >>>>PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU ANTERIOR<<<<");
							 system("pause>>NULL");
							 }; break;
				case 3:{
					 		 system("CLS");
							 printf("\t\t\ ->MOSTRANDO OBRAS POR AREA<- \n");
							 printf("\t\t\t->BIOMEDICAS<- \n\n");
							 //MostraRegistro(3);
							 printf("\n\n >>>>PRESSIONE QUALQUER TECLA PARA VOLTAR AO MENU ANTERIOR<<<<");
							 system("pause>>NULL");
							 }; break;
					default:printf("Opcao Invalida!\n");getch();
					}

		fflush(stdin);
		fclose(cadastrotombo);
}

int Vrfano(int d, int m, int a){ //Retorna 1 se a data for valida , 0 se for invalida
	 int verano; //variavel para verificar se o ano é bissexto.
	 switch(m){
	 				 case 1:case 3 :case 5:case 7:case 8: case 10: case 12:{
					 	if ((d>0)&&(d<32))return 1;
					 	else return 0;
						 	}break;
					 		case 2:{
								  verano=a%4;
								  if(verano==0){
													  if((d>0)&&(d<30))return 1;
													  else return 0;
													}
								  if(verano!=0){
												 if((d>0)&&(d<29))return 1;
													  else return 0;
													}
								  }break;
					 case 4:case 6: case 9: case 11:	{
					if ((d>0)&&(d<31))return 1;
					  else return 0;
				 default : return 0;
					 }
	 }}


void gravaobra()
{
	char R;
	FILE *cadastroobra;
	cadastroobra = fopen("obra.dat","ab+");
	if((cadastroobra = fopen("obra.dat","ab+"))==NULL)
	Erro_encerra("erro na abertura de 'obra.dat'");
	do
	{
		int a, data=0, dia, mes, ano;


		Obra umaObra;
		system("CLS");
		  printf("----------------CADRASTO DE OBRAS----------------\n\n");
		printf("Nome da obra: ");fflush(stdin);
		scanf("\n%s" ,umaObra.nobra);
		do{
			printf("Entre com a data no formato ddmmaaaa: ");
 			scanf("%d\n",&data);
			dia = data / 1000000;
 			mes = data / 10000 - data / 10000 / 100 * 100;
	 		ano = data - data / 10000 * 10000;
	 		if(!Vrfano(dia,mes,ano))
			printf("\aData Invalida! Tente novamente\n");
		}
		while(!Vrfano(dia,mes,ano));
		  printf("N. Tombo: ");fflush(stdin);
		  scanf("\n%d" ,&umaObra.ntombo);
		  printf("N.Exemplares: ");fflush(stdin);
		  scanf("\n%d" ,&umaObra.exemplar);
		  printf("-------------------------------------------------");
		  printf("\n\n");
		  printf ("Deseja cadastrar outra obra?(S/N)? ");fflush(stdin);
		  fwrite((char *)a, sizeof(Obra),1,cadastroobra);
		  R = getchar();
		}while ((R != 'N')&&(R != 'n'));
		fclose(cadastroobra);
}

void gravatmbo()
{
	char R;
	FILE *cadastrotombo;
	cadastrotombo = fopen("tombos.dat","ab+");
	if((cadastrotombo = fopen("tombos.dat","ab+"))==NULL)
	Erro_encerra("erro na abertura de 'tombos.dat'");
	do
	{
		int a;

		Tombo umTombo;
		system("CLS");
		printf("---------------CADRASTO DE TOMBOS: ---------------\n\n");
		printf("Cod. De Area: ");fflush(stdin);
		scanf("%d" ,&umTombo.carea);
		printf("N.Tombo: ");fflush(stdin);
		scanf("%d" ,&umTombo.ntombo);
		printf("Nome da obra: ");fflush(stdin);
		gets(umTombo.obra);
		printf("Nome Do Autor: ");fflush(stdin);
		gets(umTombo.autor);
		printf("Nome Da Editora: ");fflush(stdin);
		gets(umTombo.editora);

		fwrite((char *)a, sizeof(Tombo),1,cadastrotombo);
		printf("--------------------------------------------------");
		printf("\n\n");
		printf ("Deseja cadastrar outro tombo ?(S/N)? ");
		fflush(stdin);
		R = getchar();
		}
	while ((R != 'N')&&(R != 'n'));
	fclose(cadastrotombo);
}

int main(){
	system("title Sistema Bibliotecario ");
	system("color F1");
	int a;
	do{
		system("cls");
		puts("-----------MENU-----------");
		puts("1 - CADASTRAR TOMBO");
		puts("2 - CADASTRAR OBRAS");
		puts("3 - MOSTRAR OBRAS POR AREA");
		puts("4 - MOSTRAR OBRAS POR AUTOR");
		puts("5 - MOSTRAR OBRAS POR EDITORA");
		puts("6 - ENCERRAR PROGRAMA");
		puts("--------------------------");
		printf("Digite Sua Opcao: ");
		scanf("%d",&a);
		switch(a){
					case 1: gravatmbo(); break;
					case 2: gravaobra(); break;
					case 3: carea(); break;
					case 4: break;
					case 5: break;
					case 6:return 0;break;
					default:printf("Opcao Invalida!\n");getch();
					}

fflush(stdin);
}while(a!=6);

return 0;
}

 

Alguem pode dar uma força?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tipo de problemas esta tendo, tipo olhei no seu código tipo porque não utiliza:

 

ios::out //Abre para escrita

ios::in //Abre para leitura

ios::binary //Lê/escreve em modo binário

ios::ate //Vai para o final do arquivo; escreve em qualquer lugar

ios::app //Cria novo arquivo, ou adiciona ao final de um arquivo existente

 

é parecido com o que falei em um topico agora a pouco... tipo:

http://forum.imasters.com.br/index.php...p;#entry1179886

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.