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.268 ]
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.
Leitura de arquivo texto separando as colunas
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (1)
Alguém já testou o novo COSMIC Desktop? O que achou? (4)
Não consigo instalar distro antiga no virtualbox nem direto no hd (29)
queria saber como posso alterar a frequencia do meu ryzen 2300u pro (3)









