na leitura de Binários
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?
Discussão (1)
Carregando comentários...