#include #include typedef struct{ char nome[30]; int idade; } dados; dados cadastraDados(); void salvaDados(FILE *, dados *); void salvaMatrizDados(dados **); void imprimeDados(); dados **cadastroMatriz(); int main(){ dados **matrizDados; matrizDados=cadastroMatriz(); salvaMatrizDados(matrizDados); imprimeDados(); return 0; } dados cadastraDados(){ dados d; printf("Nome:");scanf("%s",d.nome); printf("Idade:");scanf("%d",&d.idade); return d; } void salvaDados(FILE *arqDados, dados *d){ fwrite(d,sizeof(dados),1,arqDados); } void salvaMatrizDados(dados **mat){ int i=0,j=0; FILE *arq = fopen("dados.bin","wb"); if(!arq){ printf("Erro na criacao do arquivo"); exit(0); } while(mat[i]!=NULL){ j=0; while(mat[i][j].idade!=-1){ salvaDados(arq,&mat[i][j++]); } ++i; } fclose(arq); } void imprimeDados(){ dados d; FILE *arq = fopen("dados.bin","rb"); if(!arq){ printf("Erro na abertura do arquivo"); exit(0); } while(fread(&d,sizeof(d),1,arq)) { printf("\nNome : %s",d.nome); printf("\nIdade :%d",d.idade); } fclose(arq); } dados **cadastroMatriz(){ dados **mat=NULL;/*Atribui mat=NULL para usar realloc como malloc*/ int i,j,op,size1,size2; size1=0;/*Inicia tamanho do vetor de ponteiros (linhas da matriz) em zero*/ do{ /*Incrementa size e realoca dinamicamente uma posição para o vetor de ponteiros*/ mat = (dados **) realloc(mat,++size1*sizeof(dados*)); /*Verifica allocação*/ if(!mat){ printf("\nErro na alocação das linhas"); exit(0); } size2=0;/*Inicia o número de colunas da matriz em zero*/ /*Atribui Null para a posição size1-1 do vetor de ponteiro (primeira vez) para usar realloc como malloc*/ mat[size1-1]=NULL; do{ /*Incrementa size e realoca dinamicamente uma posição para as colunas da matriz*/ mat[size1-1]=(dados *)realloc(mat[size1-1],++size2*sizeof(dados)); if(!mat[size1-1]){ printf("\nErro na alocação das colunas"); exit(0); } mat[size1-1][size2-1]=cadastraDados();/*Cadastra dados*/ printf("0 para parar:");scanf("%d",&op); }while(op); /*Aloca posição extra para sinalizar fim de coluna com idade=-1*/ mat[size1-1]=(dados *) realloc(mat[size1-1],++size2*sizeof(dados)); if(!mat[size1-1]){ printf("\nErro na alocação das colunas"); exit(0); } mat[size1-1][size2-1].idade=-1; printf("0 para parar:");scanf("%d",&op); }while(op); /*Aloca posição extra para sinalizar fim das linhas com mat[size1-1]=NULL*/ mat = (dados **) realloc(mat,++size1*sizeof(dados*)); mat[size1-1]=NULL; if(!mat){ printf("\nErro na alocação das linhas"); exit(0); } return mat; }