Agenda (fones, compromissos, aniversários) em C usando arquivos binários
Publicado por Leonardo Weslei Diniz 11/12/2007 (última atualização em 09/12/2009)
[ Hits: 19.202 ]
Homepage: http://www.agilesoft.com.br/
Download agenda_leonardowesleidiniz.c (versão 2)
Agenda de telefones,compromissos,aniversários em c, usando arquivos binários.
Usa sistema de login com qualquer quantidade de usuários.
Conta com a função readkey (que lê as setas up e down)para criar um menu gráfico bem interessante.
Versão 2 - Enviado por Leonardo Weslei Diniz em 28/10/2009
Changelog: Correção de erros do programa
Antes de compilar definir as variáveis: PATH_INSTALL,PATH_HOME,PATH_FILE
Ex:
#define PATH_INSTALL "/home/leonardo/agenda_c/"
#define PATH_HOME "/home/leonardo/"
#define PATH_FILE "/home/leonardo/agenda_c/users.txt"
Compilar e pronto!
Download agenda_leonardowesleidiniz.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
//==================================================================================================================
struct compromisso{//estrutura com os elementos do tipo compromisso
int dia,mes,ano;
char local[1000];
char obs[1000];
};
struct dados{//estrutura com os elementos do tipo telefone
char nome[1000];
char telefone[1000];
char email[1000];
};
struct niver{//estrutura com os elementos do tipo aniversario
int dia,mes,ano;
char nome[1000];
};
struct user{//estrutura com os elementos do tipo novo
int senha;
char nome[1000];
};
//==================================================================================================================
FILE *arquivo; //endereço de arquivo global
char nomearq[10000];//string com o nome do arquivo global
struct user a;
//==================================================================================================================
void rl_ttyset (int reset){
static struct termios old; // Armazena as configuracoes antigas
struct termios nova; // Recebe as novas configuracoes
if (reset == 0){
(void) tcgetattr (0, &old);
nova = old; // Copia as configuracoes antigas
nova.c_lflag &= ~(ECHO | ICANON);
nova.c_iflag &= ~(ISTRIP | INPCK);
(void) tcsetattr (0, TCSANOW, &nova); // Habilita as novas configuracoes
}
else
(void) tcsetattr (0, TCSANOW, &old); // Restaura as configuracoes antigas
}
//==================================================================================================================
/*Funcao parecida com a do pascal, onde o caracter digitado eh
capturado pelo programa sem precisar de enter e sem exibir
o caracter na tela (a não ser que vc mande imprimi-lo) */
//==================================================================================================================
novo(){
FILE* arq;
char DIRNAME[100],dir[100];
int x,z;//,leo[100];
struct user y;
printf("Digite o login desejado:");
gets(DIRNAME);
printf("\n");
dnov:
printf("Digite a senha desejada(somente numeros inteiros!):{FONTE}33[37;37;1m");
scanf("%d",&x);
printf("{FONTE}33[m\n");
printf("Confirme a senha(somente numeros inteiros!):{FONTE}33[37;37;1m");
scanf("%d",&z);
printf("{FONTE}33[m\n");
if(x!=z)goto dnov;
strcpy(y.nome,DIRNAME);
y.senha=x;
arq=fopen("arquivos/users.txt","a+");
chdir("/home/computacao/lwd/tp2/arquivos/");
mkdir(DIRNAME,999);
fseek(arq,0,SEEK_END);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
fwrite(&y, sizeof(struct user), 1, arq);
fclose(arq);
chdir("/home/computacao/lwd/tp2");
printf("Conta criada\nseu login é %s e sua senha é %d",DIRNAME,x);
strcpy(DIRNAME," ");
getchar();
getchar();
main();
}
//==================================================================================================================
login(){
FILE* arq;
char DIRNAME[100];
int x,cont=0;//,leo[100];
struct user y;
printf("Digite o login:");
gets(DIRNAME);
printf("\n");
printf("Digite a senha(somente numeros inteiros!):{FONTE}33[37;37;1m");
scanf("%d",&x);
printf("{FONTE}33[m\n");
arq=fopen("arquivos/users.txt","a+");
fseek(arq,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do{
fread(&y, sizeof(struct user), 1, arq);
if((strcmp(DIRNAME,y.nome)==0)&&(x==y.senha)){
cont++;
break;
}
}while(!feof(arq));
fclose(arq);
if(cont==0){
printf("login ou senha não cadastrados!");
getchar();
getchar();
main();
}
else{
strcpy(a.nome,DIRNAME);
a.senha=x;
getchar();
prin();
}
}
//==================================================================================================================
char readkey(){
char caracter;
rl_ttyset (0);
caracter = getchar();
rl_ttyset (1);
return(caracter);
}
//==================================================================================================================
Mostracom(){
int dia,mes,ano,c=0;
struct compromisso x,y[100];
printf ("\t\t\t\tDigite o data: {FONTE}33[18;49H");
scanf("%d",&dia);
printf ("{FONTE}33[18;52H/");
scanf("%d",&mes);
printf ("{FONTE}33[18;55H/");
scanf("%d",&ano);
printf ("\n");
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do{
if (feof(arquivo)) break;
fread(&x, sizeof(struct compromisso), 1, arquivo);//lê do arquivo uma coisa por vez em x
if ((x.dia==dia)&&(x.mes==mes)&&(x.ano==ano)){
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tData: %d/%d/%d\n",x.dia,x.mes,x.ano);
printf ("\t\t\t\tLocal: %s\n",x.local);
printf ("\t\t\t\tObs: %s\n",x.obs);
printf ("\t\t\t\t--------------------------------\n");
c++;
}
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if (c==0) {
printf("\t\t\t\tNão existe esse compromisso!\n");
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
getchar();
getchar();
}
//==================================================================================================================
Incluicom(){
struct compromisso x;
fseek(arquivo,0,SEEK_END);//posiciona no final do arquivo
printf ("\n\t\t\t\tDigite os dados do compromisso nos campos abaixo:\n");
printf ("\t\t\t\tData((dia)-press enter,(mes)-press enter, (ano)-press enter):{FONTE}33[22;49H");
scanf("%d",&x.dia);
printf ("{FONTE}33[22;52H/");
scanf("%d",&x.mes);
printf ("{FONTE}33[22;55H/");
scanf("%d",&x.ano);
printf ("\n");
printf ("\t\t\t\tLocal:");
gets(x.local);
gets(x.local);
printf("\t\t\t\tObs(vc pode usar as observaçoes para digitar ahora e os detalhes do compromisso):\n\t\t\t\t");
gets(x.obs);
fwrite(&x, sizeof(struct compromisso), 1, arquivo);
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tCompromisso gravado!\n\t\t\t\tpress enter");
getchar();
}
//==================================================================================================================
Mostratodoscom(){
int i=0,n,MIN,j,m=0;
struct compromisso x,y[1000],z[1000],aux;
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do {
if(feof(arquivo))break;
fread(&y[i], sizeof(struct compromisso), 1, arquivo);//lê do arquivo uma coisa por vez em vet na posição i
i++;
n=i;
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
for(i = 0; i<n; i++){//organiza pelo ano
MIN = i;
for(j = i+1; j<n; j++){
if((y[j].ano<y[MIN].ano)){
aux = y[MIN];
y[MIN] = y[j];
y[j] = aux;
MIN=j;
}
}
}
for(i = 0; i<n; i++){//se o ano for igual organiza por mes
MIN = i;
for(j = i+1; j<n; j++){
if((y[j].ano==y[MIN].ano)&&(y[j].mes<y[MIN].mes)){
aux = y[MIN];
y[MIN] = y[j];
y[j] = aux;
MIN=j;
}
}
}
for(i = 0; i<n; i++){//organiza o vetor usando como condições as variaveis do vetor do tipo inteiro
MIN = i;
for(j = i+1; j<n; j++){
if((y[j].ano<y[MIN].ano)&&(y[j].mes<y[MIN].mes)&&(y[j].dia<y[MIN].dia)){
aux = y[MIN];
y[MIN] = y[j];
y[j] = aux;
MIN=j;
}
}
}
if(n>1){
for(i=1;i<n;i++){
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tData: %d/%d/%d\n",y[i].dia,y[i].mes,y[i].ano);
printf ("\t\t\t\tLocal: %s\n",y[i].local);
printf ("\t\t\t\tObs: %s\n",y[i].obs);
printf ("\t\t\t\t--------------------------------\n");
y[i].dia=0;
y[i].mes=0;
y[i].ano=0;
strcat(y[i].local,"{FONTE}");
strcat(y[i].obs,"{FONTE}");
}
}
n=0;
i=0;
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
getchar();
}
//==================================================================================================================
Apagacom(){
int reg,i=0,j,n,z=0,dia,mes,ano;
struct compromisso f,x,vet[1000];
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
printf ("\n\t\t\t\tDigite a data do compromisso a ser apagado abaixo:\n");
printf ("\t\t\t\tData((dia)-press enter,(mes)-press enter, (ano)-press enter):{FONTE}33[22;49H");
scanf("%d",&dia);
printf ("{FONTE}33[22;52H/");
scanf("%d",&mes);
printf ("{FONTE}33[22;55H/");
scanf("%d",&ano);
printf ("\n");
do{
fread(&vet[i], sizeof(struct compromisso), 1, arquivo);//lê do arquivo uma coisa por vez em vet na posição i
if((vet[i].ano == ano)&&(vet[i].mes == mes)&&(vet[i].dia == dia)){
z++;
}
i++;
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if(z==0)
goto fim;
fclose(arquivo);//Fecha o arquivo binario.
arquivo=fopen(nomearq,"wb");//Abre o arquivo binario para gravar mas apaga tudo o que tem dentro do arquivo.
for(j=0;j<i-z;j++){
if((vet[j].ano==ano)&&(vet[j].mes==mes)&&(vet[j].dia==dia))j=j+1;//Se as condições forem verdadeiras pula a posição do vetor escolhida pelo usuario para ser apagado.
if((vet[j].ano<=0)||(vet[j].mes<=0)||(vet[j].dia<=0))j=j+1;
fwrite(&vet[j], sizeof(struct compromisso), 1, arquivo);//escreve o vetor no arquivo
}
fclose(arquivo);//Fecha o arquivo binario.
fim:
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tCompromisso apagado com sucesso!\n\t\t\t\t press enter");
getchar();
getchar();
printf ("\t\t\t\t");
}
//==================================================================================================================
Mostra() {
char reg[100];
int i=0,v,c=0;
struct dados x;
printf ("\t\t\t\tDigite o nome da pessoa: ");
gets(reg);
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do{
if (feof(arquivo)) break;
fread(&x, sizeof(struct dados), 1, arquivo);//lê do arquivo uma coisa por vez em x
v=strcmp(x.nome,reg);
if(v==0){
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tNome: %s\n",x.nome);
printf ("\t\t\t\tTelefone: %s\n",x.telefone);
printf ("\t\t\t\tEmail: %s\n",x.email);
printf ("\t\t\t\t--------------------------------\n");
c++;
}
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if (c==0) {
printf("\t\t\t\tNão existe esse registro!\n");
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
printf ("\t\t\t\t");
getchar();
}
//==================================================================================================================
MostraTodos() {
int reg,n,i,MIN,j,p,q=0;
struct dados x,z[100],aux;
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
reg=0;
do {
if(feof(arquivo))break;
fread(&x, sizeof(struct dados), 1, arquivo);//lê do arquivo uma coisa por vez em x
z[reg]=x;
reg++;
} while(!feof(arquivo));//Enquanto diferente de final de arquivo.
n=reg;
for(i = 0; i<n; i++){
MIN = i;
for(j = i+1; j<n; j++){
p=strcmp(z[j].nome,z[MIN].nome);
if(p==-1){
MIN = j;
}
aux = z[MIN];
z[MIN] = z[i];
z[i] = aux;
}
}
for(reg=0;reg<n;reg++){
if(strcmp(z[reg].nome,z[reg-1].nome)==0){
for(i=reg-1; i<n;i++){
z[i]=z[i+1];
}
}
}
if(n>1){
for(reg=0;reg<n-1;reg++){
x=z[reg];
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tNome: %s\n",x.nome);
printf ("\t\t\t\tTelefone: %s\n",x.telefone);
printf ("\t\t\t\tEmail: %s\n",x.email);
printf ("\t\t\t\t--------------------------------\n");
}
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
printf ("\t\t\t\t");
getchar();
}
//==================================================================================================================
IncluiRegistro() {
char lixo[255];
struct dados x;
fseek(arquivo,0,SEEK_END);//posiciona no final do arquivo
printf ("\n\t\t\t\tDigite os dados da pessoa nos campos abaixo:\n");
printf ("\t\t\t\tNome:");
gets(x.nome);
printf ("\t\t\t\tTelefone:");
gets(x.telefone);
printf ("\t\t\t\tEmail:");
gets(x.email);
fwrite(&x, sizeof(struct dados), 1, arquivo);
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tContato gravado!\n\t\t\t\tpress enter");
printf ("\t\t\t\t");
getchar();
}
//==================================================================================================================
ApagaUlt(){
int reg,i=0,j,n,z=0;
char nome[200];
struct dados f,x,vet[1000];
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
printf ("\n\t\t\t\tDigite o nome do contato a ser apagado abaixo:\n");
printf ("{FONTE}33[22;49H");
gets(nome);
printf ("\n");
do{
fread(&vet[i], sizeof(struct dados), 1, arquivo);//lê do arquivo uma coisa por vez em vet na posição i
if(strcmp(vet[i].nome,nome)==0){
z++;
}
i++;
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if(z==0)
goto fim;
fclose(arquivo);//Fecha o arquivo binario.
arquivo=fopen(nomearq,"wb");//Abre o arquivo binario para gravar mas apaga tudo o que tem dentro do arquivo.
for(j=0;j<i-z;j++){
if((strcmp(vet[j].nome,nome)==0)&&(j<i))j=j+1;//Se a condição for verdadeira pula a posição do vetor escolhida pelo usuario para ser apagado.
fwrite(&vet[j], sizeof(struct dados), 1, arquivo);//escreve o vetor no arquivo
}
fclose(arquivo);//Fecha o arquivo binario.
fim:
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tContato apagado com sucesso!\n\t\t\t\t press enter");
getchar();
printf ("\t\t\t\t");
}
//==================================================================================================================
Mostraniver() {
int dia,mes,ano,c=0;
struct niver x,y[100];
printf ("\t\t\t\tDigite o data: {FONTE}33[18;49H");
scanf("%d",&dia);
printf ("{FONTE}33[18;52H/");
scanf("%d",&mes);
printf ("{FONTE}33[18;55H/");
scanf("%d",&ano);
printf ("\n");
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do{
if (feof(arquivo)) break;
fread(&x, sizeof(struct niver), 1, arquivo);//lê do arquivo uma coisa por vez em x
if ((x.dia==dia)&&(x.mes==mes)&&(x.ano==ano)){
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tData: %d/%d/%d\n",x.dia,x.mes,x.ano);
printf ("\t\t\t\tNome: %s\n",x.nome);
printf ("\t\t\t\t--------------------------------\n");
c++;
}
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if (c==0) {
printf("\t\t\t\tAinda não foi anotado essa data!\n");
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
getchar();
getchar();
printf ("\t\t\t\t");
}
//==================================================================================================================
MostraTodosniver() {
int reg=0,n,i,MIN,j,p,q=0;
struct niver x,z[100],aux;
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
do {
if(feof(arquivo))break;
fread(&x, sizeof(struct niver), 1, arquivo);
z[reg]=x;
reg++;
} while(!feof(arquivo));//Enquanto diferente de final de arquivo.
n=reg;
for(i = 0; i<n; i++){
MIN = i;
for(j = i+1; j<n; j++){
p=strcmp(z[j].nome,z[MIN].nome);
if(p==-1){
MIN = j;
}
aux = z[MIN];
z[MIN] = z[i];
z[i] = aux;
}
}
for(reg=0;reg<n;reg++){
if(strcmp(z[reg].nome,z[reg-1].nome)==0){
for(i=reg-1; i<n;i++){
z[i]=z[i+1];
}
}
}
if(n>1){
for(reg=0;reg<n-1;reg++){
x=z[reg];
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tNome: %s\n",x.nome);
printf ("\t\t\t\tFaz aniverssario em: %d/%d/%d\n",x.dia,x.mes,x.ano);
printf ("\t\t\t\t--------------------------------\n");
}
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tpress enter");
getchar();
}
//==================================================================================================================
Incluiniver() {
struct niver x;
fseek(arquivo,0,SEEK_END);//posiciona no final do arquivo
printf ("\n\t\t\t\tDigite a data e o nome da pessoa nos campos abaixo:\n");
printf ("\t\t\t\tNome:");
gets(x.nome);
printf ("\t\t\t\tData((dia)-press enter,(mes)-press enter, (ano)-press enter):{FONTE}33[21;94H");
scanf("%d",&x.dia);
printf ("{FONTE}33[21;96H/");
scanf("%d",&x.mes);
printf ("{FONTE}33[21;99H/");
scanf("%d",&x.ano);
printf ("\n");
fwrite(&x, sizeof(struct niver), 1, arquivo);
fclose(arquivo);//Fecha o arquivo binario.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tData gravada!\n\t\t\t\tpress enter");
getchar();
getchar();
}
//==================================================================================================================
Apaganiver(){
int reg,i=0,j,n,z=0,dia,mes,ano;
struct niver f,x,vet[1000];
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
fseek(arquivo,0,SEEK_SET);//A função fseek ajusta o indicador de posição apontado pelas strings :SEEK_SET, SEEK_CUR, ou SEEK_END.
printf ("\n\t\t\t\tDigite a data do aniverssario a ser apagado abaixo:\n");
printf ("\t\t\t\tData((dia)-press enter,(mes)-press enter, (ano)-press enter):{FONTE}33[22;49H");
scanf("%d",&dia);
printf ("{FONTE}33[22;52H/");
scanf("%d",&mes);
printf ("{FONTE}33[22;55H/");
scanf("%d",&ano);
printf ("\n");
do{
fread(&vet[i], sizeof(struct niver), 1, arquivo);//lê do arquivo uma coisa por vez em vet na posição i
if((vet[i].ano == ano)&&(vet[i].mes == mes)&&(vet[i].dia == dia)){
z++;
}
i++;
}while(!feof(arquivo));//Enquanto diferente de final de arquivo.
if(z==0)
goto fim;
fclose(arquivo);//Fecha o arquivo binario.
arquivo=fopen(nomearq,"wb");//Abre o arquivo binario para gravar mas apaga tudo o que tem dentro do arquivo.//Abre o arquivo binario para gravar mas apaga tudo o que tem dentro do arquivo.
for(j=0;j<i;j++){
if((vet[j].ano==ano)&&(vet[j].mes==mes)&&(vet[j].dia==dia))j=j+1;//Se as condições forem verdadeiras pula a posição do vetor escolhida pelo usuario para ser apagado.
if((vet[j].ano==0)&&(vet[j].mes==0)&&(vet[j].dia==0))j=j+1;//Se as condições forem verdadeiras pula a posição do vetor escolhida pelo usuario para ser apagado.
fwrite(&vet[j], sizeof(struct niver), 1, arquivo);//escreve o vetor no arquivo
}
fclose(arquivo);//Fecha o arquivo binario.
arquivo=fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
fim:
printf ("\t\t\t\t--------------------------------\n");
printf ("\t\t\t\tData apagada com sucesso!\n\t\t\t\t press enter");
getchar();
getchar();
}
//==================================================================================================================
manual(){
system("clear");//Limpa a tela.
printf("\n\t\t-------------------------------------------------------------------\n\t\tPara usar a agenda selecione uma opção com as setas\n\t\te execute as ações indicadas depois de selecionadas\n\t\t--------------------------------------------------------------------\n\t\tpress enter\n");
getchar();
}
//==================================================================================================================
alerta(){
system("clear");//Limpa a tela.
printf("\n\t\t-------------------------------------------------------------------\n\t\tO programa é muito simples, mas sob presença de qualquer duvida\n\t\t mande um email para \"leonardowd@gmail.com\"\n\t\t ou \"exterminador3@gmail.com\".FLW...\n\t\t--------------------------------------------------------------------\n\t\tpress enter\n");
getchar();
}
//==================================================================================================================
desenvolvedor(){
system("clear");//Limpa a tela.
printf("\n\t\t-------------------------------------------------------------------\n\t\tAluno: Leonardo Weslei Diniz\n\t\tCurso: Ciencia da computação 1º Periodo\n\t\tProf: Erikson de Freitas Morais\n\t\tMat: Prática de programação I\n\t\t--------------------------------------------------------------------\n\t\tpress enter\n");
getchar();
}
//==================================================================================================================
agradescimentos(){
system("clear");//Limpa a tela.
printf("\n\t\t-------------------------------------------------------------------\n\t\tA todos que possibilitaram esse projeto possivel.\n\t\t--------------------------------------------------------------------\n\t\tpress enter\n");
getchar();
}
//==================================================================================================================
menu(char a[55],char b[55],char c[55],char d[55],char e[55]){//Recebe os itens do menu e o subtitulo por argumento.
int t,i;
char op1a='>', op1b='<',op1c='-', op2a=' ', op2b=' ', op2c=' ', op3a=' ', op3c=' ',op3b=' ', op4a=' ', op4c=' ', op4b=' ', op5a=' ',op5b=' ',op5c=' ',op6a=' ',op6b=' ',op6c=' ';
int op=1;
char texto[50]=" ";
if (strcmp(e, "AGENDA DE TELEFONES")==0) strcat(nomearq,"/tel.txt");//copia "AGENDA DE TELEFONES" para a string nomearq se acondição for verdadeira.
if (strcmp(e, "AGENDA DE COMPROMISSOS")==0) strcat(nomearq,"/com.txt");//copia "AGENDA DE COMPROMISSOS" para a string nomearq se acondição for verdadeira.
if (strcmp(e, "ANIVERSSARIOS")==0) strcat(nomearq,"/niver.txt");//copia "ANIVERSSARIOS" para a string nomearq se acondição for verdadeira.
arquivo = fopen(nomearq,"ab+");//Abre o arquivo binario para acrescentar e se não existe o cria.//Abre o arquivo binario para acrescentar e se não existe o cria.
inicio:
system("clear");//Limpa a tela.
do{
for(i=0;i<459;i++){
printf("%c",' ');
}
for(i=0;i<312;i++){
printf("%c",' ');
}
for(i=0;i<150;i++){
printf("%c",' ');
}
printf("{FONTE}33[2;54H---MULTI-AGENDA---");
//------Posiciona o subtitulo de acordo com seu tamanho.
if (strcmp(e, "AGENDA DE TELEFONES")==0)printf("{FONTE}33[3;52H---%s---",e);
if (strcmp(e, "AGENDA DE COMPROMISSOS")==0)printf("{FONTE}33[3;50H---%s---",e);
if (strcmp(e, "ANIVERSSARIOS")==0)printf("{FONTE}33[3;53H---%s---",e);
if (strcmp(e, "AJUDA")==0)printf("{FONTE}33[3;57H---%s---",e);
//------------------------------------------------------
printf("{FONTE}33[7;48H+------------------------------+");
printf("{FONTE}33[8;48H| %1c%1c %1c%1c |",op1c,op1a,op1b,op1c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[9;48H| %1c%1c %1c%1c |",op2c,op2a,op2b,op2c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[10;48H| %1c%1c %1c%1c |",op3c,op3a,op3b,op3c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[11;48H| %1c%1c %1c%1c |",op4c,op4a,op4b,op4c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[12;48H| %1c%1c MENU %1c%1c |",op5c,op5a,op5b,op5c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[13;48H| %1c%1c SAIR %1c%1c |",op6c,op6a,op6b,op6c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[14;48H+------------------------------+");
printf("{FONTE}33[4;51H+------------------------+");
printf("{FONTE}33[5;51H| DATA : %s |\n{FONTE}33[6;51H| HORA: %s |\n",__DATE__,__TIME__);
printf("{FONTE}33[7;51H+------------------------+");
printf("{FONTE}33[16;42H Use as teclas seta para cima e para baixo para movimentar o menu.");
printf("{FONTE}33[17;48H Use ENTER para selecionar a opção.");
printf("{FONTE}33[8;53H %s",a);//Opção 1 recebida por argumento.
printf("{FONTE}33[9;53H %s",b);//Opção 2 recebida por argumento.
printf("{FONTE}33[10;53H %s",c);//Opção 3 recebida por argumento.
printf("{FONTE}33[11;53H %s",d);//Opção 4 recebida por argumento.
printf("{FONTE}33[18;1H %s",texto);
fflush(stdout);
fflush(stdin);
/*A função fflush força a gravação de todos os dados bufferizados para a
saída dada ou atualiza stream através da função write subjacente da
stream. O estado de abertura da stream não é afetado.
Se o argumento stream é NULL, fflush descarrega todas as streams de
saída abertas.*/
t=readkey();
if (t==10 && op==6){//sai do programa .
system("clear");//Limpa a tela.
exit(0);// A função exit() causa o término normal do programa.
}
if (t==10 && op==5){//volta para o menu.
prin();//chama o prin meio que uma função recursiva.
t=0;
}
if (t==10 && op==4){//executa as funções de acordo com o subtitulo recebido.
if (e== "AGENDA DE TELEFONES"){
MostraTodos();
goto inicio;
}
if (e== "AGENDA DE COMPROMISSOS"){
Mostratodoscom();
goto inicio;
}
if (e== "ANIVERSSARIOS"){
MostraTodosniver();
goto inicio;
}
if (e== "AJUDA"){
agradescimentos();
goto inicio;
}
else
printf("op4");
t=0;
}
if (t==10 && op==3){//executa as funções de acordo com o subtitulo recebido.
if (e== "AGENDA DE TELEFONES"){
ApagaUlt();
goto inicio;
}
if (e== "AGENDA DE COMPROMISSOS"){
Apagacom();
goto inicio;
}
if (e== "ANIVERSSARIOS"){
Apaganiver();
goto inicio;
}
if (e== "AJUDA"){
desenvolvedor();
goto inicio;
}
else
printf("op3");
t=0;
}
if (t==10 && op==2){//executa as funções de acordo com o subtitulo recebido.
if (e== "AGENDA DE TELEFONES"){
Mostra();
goto inicio;
}
if (e== "AGENDA DE COMPROMISSOS"){
Mostracom();
goto inicio;
}
if (e== "ANIVERSSARIOS"){
Mostraniver();
goto inicio;
}
if (e== "AJUDA"){
alerta();
goto inicio;
}
else
printf("op2");
t=0;
}
if (t==10 && op==1){//executa as funções de acordo com o subtitulo recebido.
if (e== "AGENDA DE TELEFONES"){
IncluiRegistro();
goto inicio;
}
if (e== "AGENDA DE COMPROMISSOS"){
Incluicom();
goto inicio;
}
if (e== "ANIVERSSARIOS"){
Incluiniver();
goto inicio;
}
if (e== "AJUDA"){
manual();
goto inicio;
}
else
printf("op1");
t=0;
}
if(t==65 && op==1){ //seta pra cima e op =1
op1a=' '; op1b=' ';
op6a='>'; op6b='<';
op1c=' '; op6c='-';
t=0;
op=6;
}
if(t==65 && op==2){
op1a='>'; op1b='<';
op2a=' '; op2b=' ';
op2c=' '; op1c='-';
t=0;
op=1;
}
if(t==65 && op==3){
op2a='>'; op2b='<';
op3a=' '; op3b=' ';
op3c=' '; op2c='-';
t=0;
op=2;
}
if(t==65 && op==4){
op3a='>'; op3b='<';
op4a=' '; op4b=' ';
op4c=' '; op3c='-';
t=0;
op=3;
}
if(t==65 && op==5){
op4a='>'; op4b='<';
op5a=' '; op5b=' ';
op5c=' '; op4c='-';
t=0;
op=4;
}
if(t==65 && op==6){
op5a='>'; op5b='<';
op6a=' '; op6b=' ';
op6c=' '; op5c='-';
t=0;
op=5;
}
if(t==66 && op==1){ //seta pra baixo
op1a=' '; op1b=' ';
op2a='>'; op2b='<';
op1c=' '; op2c='-';
t=0;
op=2;
}
if(t==66 && op==2){
op2a=' '; op2b=' ';
op3a='>'; op3b='<';
op2c=' '; op3c='-';
t=0;
op=3;
}
if(t==66 && op==3){
op3a=' '; op3b=' ';
op4a='>'; op4b='<';
op3c=' '; op4c='-';
t=0;
op=4;
}
if(t==66 && op==4){
op4a=' '; op4b=' ';
op5a='>'; op5b='<';
op4c=' '; op5c='-';
t=0;
op=5;
}
if(t==66 && op==5){
op5a=' '; op5b=' ';
op6a='>'; op6b='<';
op5c=' '; op6c='-';
t=0;
op=6;
}
if(t==66 && op==6){
op1a='>'; op1b='<';
op6a=' '; op6b=' ';
op6c=' '; op1c='-';
t=0;
op=1;
}
}while(1);
}
//==================================================================================================================
prin(){
int t,i;
char op1a='>', op1b='<',op1c='-', op2a=' ', op2b=' ', op2c=' ', op3a=' ', op3c=' ',op3b=' ', op4a=' ', op4c=' ', op4b=' ', op5a=' ',op5b=' ',op5c=' ';
int op=1;
char texto[50]=" ";
system("clear");//Limpa a tela.
strcpy(nomearq,"{FONTE}");
strcat(nomearq,"arquivos/");
strcat(nomearq,a.nome);
ini:
do{
for(i=0;i<459;i++){
printf("%c",' ');
}
for(i=0;i<312;i++){
printf("%c",' ');
}
for(i=0;i<150;i++){
printf("%c",' ');
}
printf("{FONTE}33[2;57HMULTI-AGENDA");
printf("{FONTE}33[7;48H+-- ------------------------ --+");
printf("{FONTE}33[8;48H| %1c%1c COMPROMISSOS %1c%1c |",op1c,op1a,op1b,op1c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[9;48H| %1c%1c ANIVERSSARIOS %1c%1c |",op2c,op2a,op2b,op2c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[10;48H| %1c%1c TELEFONES %1c%1c |",op3c,op3a,op3b,op3c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[11;48H| %1c%1c AJUDA %1c%1c |",op4c,op4a,op4b,op4c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[12;48H| %1c%1c SAIR %1c%1c |",op5c,op5a,op5b,op5c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[13;48H+------------------------------+");
printf("{FONTE}33[4;51H+------------------------+");
printf("{FONTE}33[5;51H| DATA : %s |\n{FONTE}33[6;51H| HORA: %s |\n",__DATE__,__TIME__);
printf("{FONTE}33[7;51H+------------------------+");
printf("{FONTE}33[15;42H Use as teclas seta para cima e para baixo para movimentar o menu.");
printf("{FONTE}33[16;48H Use ENTER para selecionar a opção.{FONTE}33[18;70H");
printf("{FONTE}33[17;1H %s",texto);
fflush(stdout);
fflush(stdin);
/*A função fflush força a gravação de todos os dados bufferizados para a
saída dada ou atualiza stream através da função write subjacente da
stream. O estado de abertura da stream não é afetado.
Se o argumento stream é NULL, fflush descarrega todas as streams de
saída abertas.*/
t=readkey();
if (t==10 && op==5){//sai do programa.
system("clear");//Limpa a tela.
exit(0);// A função exit() causa o término normal do programa.
}
if (t==10 && op==4){//passa para a função menu as strings de acordo com a escolha do usuario.
menu("MANUAL DA MULTI-AGENDA","ALERTAS DE USO (LEIA!)"," DESENVOLVEDOR"," AGRADECIMENTOS","AJUDA");
goto ini;//chama o prin meio que uma função recursiva.
t=0;
}
if (t==10 && op==3){//passa para a função menu as strings de acordo com a escolha do usuario.
menu(" NOVO CONTATO"," VER CONTATO"," APAGAR COMTATO"," LISTAR CONTATOS","AGENDA DE TELEFONES");
goto ini;//chama o prin meio que uma função recursiva.
t=0;
}
if (t==10 && op==2){//passa para a função menu as strings de acordo com a escolha do usuario.
menu(" NOVA DATA"," PROCURAR DATA","APAGAR ANIVERSSARIO"," LISTAR TODOS","ANIVERSSARIOS");
goto ini;//chama o prin meio que uma função recursiva.
t=0;
}
if (t==10 && op==1){//passa para a função menu as strings de acordo com a escolha do usuario.
menu(" NOVO COMPROMISSO"," VER COMPROMISSOS"," APAGAR COMPROMISSO","VER TODOS COMPROMISSOS","AGENDA DE COMPROMISSOS");
goto ini;//chama o prin meio que uma função recursiva.
t=0;
}
if(t==65 && op==1){ //seta pra cima e op =1
op1a=' '; op1b=' ';
op5a='>'; op5b='<';
op1c=' '; op5c='-';
t=0;
op=5;
}
if(t==65 && op==2){
op1a='>'; op1b='<';
op2a=' '; op2b=' ';
op2c=' '; op1c='-';
t=0;
op=1;
}
if(t==65 && op==3){
op2a='>'; op2b='<';
op3a=' '; op3b=' ';
op3c=' '; op2c='-';
t=0;
op=2;
}
if(t==65 && op==4){
op3a='>'; op3b='<';
op4a=' '; op4b=' ';
op4c=' '; op3c='-';
t=0;
op=3;
}
if(t==65 && op==5){
op4a='>'; op4b='<';
op5a=' '; op5b=' ';
op5c=' '; op4c='-';
t=0;
op=4;
}
if(t==66 && op==1){ //seta pra baixo
op1a=' '; op1b=' ';
op2a='>'; op2b='<';
op1c=' '; op2c='-';
t=0;
op=2;
}
if(t==66 && op==2){
op2a=' '; op2b=' ';
op3a='>'; op3b='<';
op2c=' '; op3c='-';
t=0;
op=3;
}
if(t==66 && op==3){
op3a=' '; op3b=' ';
op4a='>'; op4b='<';
op3c=' '; op4c='-';
t=0;
op=4;
}
if(t==66 && op==4){
op4a=' '; op4b=' ';
op5a='>'; op5b='<';
op4c=' '; op5c='-';
t=0;
op=5;
}
if(t==66 && op==5){
op5a=' '; op5b=' ';
op1a='>'; op1b='<';
op5c=' '; op1c='-';
t=0;
op=1;
}
}while(1);
}
//==================================================================================================================
main(){
int t,i;
char op1a='>', op1b='<',op1c='-', op2a=' ', op2b=' ', op2c=' ', op3a=' ', op3c=' ',op3b=' ', op4a=' ', op4c=' ', op4b=' ', op5a=' ',op5b=' ',op5c=' ';
int op=1;
char texto[50]=" ";
system("clear");//Limpa a tela.
strcat(nomearq,"arquivos/");
strcat(nomearq,a.nome);
do{
for(i=0;i<459;i++){
printf("%c",' ');
}
for(i=0;i<312;i++){
printf("%c",' ');
}
for(i=0;i<150;i++){
printf("%c",' ');
}
printf("{FONTE}33[2;57HMULTI-AGENDA");
printf("{FONTE}33[7;48H+-- ------------------------ --+");
printf("{FONTE}33[8;48H| %1c%1c Login %1c%1c |",op1c,op1a,op1b,op1c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[9;48H| %1c%1c Criar conta %1c%1c |",op2c,op2a,op2b,op2c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[10;48H| %1c%1c SAIR %1c%1c |",op3c,op3a,op3b,op3c);//%1c%1c imprime as setinhas na tela
printf("{FONTE}33[11;48H+------------------------------+");
printf("{FONTE}33[4;51H+------------------------+");
printf("{FONTE}33[5;51H| DATA : %s |\n{FONTE}33[6;51H| HORA: %s |\n",__DATE__,__TIME__);
printf("{FONTE}33[7;51H+------------------------+");
printf("{FONTE}33[13;42H Use as teclas seta para cima e para baixo para movimentar o menu.");
printf("{FONTE}33[14;48H Use ENTER para selecionar a opção.{FONTE}33[18;70H");
printf("{FONTE}33[15;1H %s",texto);
fflush(stdout);
fflush(stdin);
/*A função fflush força a gravação de todos os dados bufferizados para a
saída dada ou atualiza stream através da função write subjacente da
stream. O estado de abertura da stream não é afetado.
Se o argumento stream é NULL, fflush descarrega todas as streams de
saída abertas.*/
t=readkey();
if (t==10 && op==3){//sai do programa.
system("clear");//Limpa a tela.
exit(0);// A função exit() causa o término normal do programa.
}
if (t==10 && op==2){//passa para a função menu as strings de acordo com a escolha do usuario.
novo();
t=0;
}
if (t==10 && op==1){//passa para a função menu as strings de acordo com a escolha do usuario.
login();
t=0;
}
if(t==65 && op==1){ //seta pra cima e op =1
op1a=' '; op1b=' ';
op3a='>'; op3b='<';
op1c=' '; op3c='-';
t=0;
op=3;
}
if(t==65 && op==2){
op1a='>'; op1b='<';
op2a=' '; op2b=' ';
op2c=' '; op1c='-';
t=0;
op=1;
}
if(t==65 && op==3){
op2a='>'; op2b='<';
op3a=' '; op3b=' ';
op3c=' '; op2c='-';
t=0;
op=2;
}
if(t==66 && op==1){ //seta pra baixo
op1a=' '; op1b=' ';
op2a='>'; op2b='<';
op1c=' '; op2c='-';
t=0;
op=2;
}
if(t==66 && op==2){
op2a=' '; op2b=' ';
op3a='>'; op3b='<';
op2c=' '; op3c='-';
t=0;
op=3;
}
if(t==66 && op==3){
op3a=' '; op3b=' ';
op1a='>'; op1b='<';
op3c=' '; op1c='-';
t=0;
op=1;
}
}while(1);
}
//==================================================================================================================
//num ta muito explicadinho não mas é facil de se entender.
Codigo para criar arquivo de log
Cadastor de Produtos em C e metodos ordenação
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









