|
-
December 1st, 2002, 08:45 PM
#1
ATM Program "server.c program"
****************************************************
server program
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#define FIFO_NAME "request"
#define FILE_NAME "conta.txt"
#define MAXBUFO 100
#define MAXBUF 100
#define MAXBUFA 100
void *escreve(void *);
void le_ficheiro(void);
void cria_conta(char *, int);
int compara(const void*, const void*);
void le_saldo(char *);
void levanta_dinheiro(char *, int);
void deposita_dinheiro(char *, int);
void cria_conta(char *, int);
void listacontas(void);
void shutdown(void);
void escreve_ficheiro(void);
typedef struct ficha
{
char nome[50];
int saldo;
}contas;
contas *conta;
int num_contas, flag = 0;
char resposta[MAXBUFA];
int main(void)
{
FILE *fp;
char buf[MAXBUF];
char caracter;
int cont = 0;
char *temp;
pthread_t tid;
le_ficheiro();
qsort(conta, num_contas, sizeof(contas), compara);
mkfifo("./request", 0644);
fp = fopen(FIFO_NAME, "r");
//while(flag == 0);
//{
caracter = fgetc(fp);
while(caracter != EOF)
{
if(caracter == '\0')
{
buf[cont] = '\0';
cont++;
}
else
{
buf[cont] = caracter;
cont++;
}
caracter = fgetc(fp);
}
fclose(fp);
temp = (char *)malloc(cont);
strcpy(temp, buf);
pthread_create(&tid, NULL, escreve, (void *)temp);
//onde foi colocado o que estava o que veio do FIFO
pthread_join(tid, NULL);
//}
unlink("./request");
escreve_ficheiro();
return 0;
}
void le_ficheiro(void)
{
FILE *fp;
char caracter;
char name[100], saldos[100], n_contas[100];
int cont=0, conto=0, contu=0, n=0, i=0, salda;
fp = fopen(FILE_NAME, "r");
caracter = fgetc(fp);
while(caracter != EOF)
{
if(n == 0)
{
if(caracter == '\n')
{
n_contas[cont] = '\0';
cont = 0;
n++;
}
else
{
n_contas[cont] = caracter;
cont++;
}
caracter = fgetc(fp);
num_contas = atoi(n_contas);
conta = (contas*) malloc(sizeof(contas) * num_contas);
}
else
if(n == 1)
{
if(caracter == '|')
{
name[conto] = '\0'; //termina as strings que contêm os nomes
conto = 0;
n++;
strcpy(conta[i].nome, name); }
}
else
{
name[conto] = caracter;
conto++;
}
caracter = fgetc(fp);
}
else
if(n == 2)
{
if(caracter == '\n')
{
saldos[contu] = '\0';
contu = 0;
n--;
salda = atoi(saldos);
conta[i].saldo = salda;
i++;
}
else
{
saldos[contu] = caracter;
contu++;
}
caracter = fgetc(fp);
}
}
fclose(fp);
return;
}
int compara(const void *a, const void *b)
{
return strcasecmp(a, b);
}
void *escreve(void *arg)
{
char pide[MAXBUFO], operacao[MAXBUFA], cliente[MAXBUFA], montante[MAXBUFA], name[20];
char caracter;
int wf, n = 1, opera, montant;
int cont = 0, conta = 0, conto = 0, contu = 0, contador = 0;
char *meu_buf;
meu_buf = (char *)arg;
printf("\n O que vem do cliente e: %s\n", meu_buf);
caracter = meu_buf[contador];
while(caracter != '\0')
{
if(n == 1)
{
if(caracter == '|') "|"
{
pide[conta] = '\0';
conta++;
n++;
}
else
{
pide[conta] = caracter;
conta++;
}
contador++;
caracter = meu_buf[contador];
}
if(n == 2)
{
if(caracter == '|') "|"
{
operacao[cont] = '\0';
cont++;
n++;
}
else
{
operacao[cont] = caracter;
cont++;
}
contador++;
caracter = meu_buf[contador];
}
if(n == 3)
{
if(caracter == '|') "|"
{
cliente[conto] = '\0';
printf("{%s}\n", cliente);
conto++;
n++;
}
else
{
cliente[conto] = caracter;
conto++;
}
contador++;
caracter = meu_buf[contador];
}
if(n == 4)
{
montante[contu] = caracter;
contu++;
contador++;
caracter = meu_buf[contador];
}
}
montante[contu] = '\0';
opera = atoi(operacao);
montant = atoi(montante);
switch(opera)
{
case 1:
le_saldo(cliente);
break;
case 2:
levanta_dinheiro(cliente, montant);
break;
case 3:
deposita_dinheiro(cliente, montant);
break;
case 4:
cria_conta(cliente, montant);
break;
case 5:
listacontas();
break;
case 6:
shutdown();
break;
}
sprintf(name, "./ans%s", pide);
wf=open(name, O_WRONLY);
write(wf, resposta, strlen(resposta)+1);
return 0;
}
void le_saldo(char *cliente)
{
int montante;
contas *user;
printf("\n\n [%s]\n\n", cliente);
user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);
if(user != NULL)
{
montante = user->saldo;
printf("\n\n O saldo do %s e de %d euros \n\n", cliente, montante);
sprintf(resposta,"O saldo do %s e de %d euros", cliente, montante);
}
else
{
printf("\n\n Não existe a conta da qual pretende saber o saldo \n\n");
sprintf(resposta, "Não existe a conta da qual pretende saber o saldo");
}
return;
}
void levanta_dinheiro(char *cliente, int montant)
{
int saldo;
contas *user;
user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);
if(user == NULL) {
printf("\n\n Não existe a conta da qual pretende levantar %d euros\n\n", montant);
sprintf(resposta, "Não existe a conta da qual pretende levantar %d euros", montant);
}
else
{
if((((contas *)user)->saldo) - montant < 0)
{
printf("\n\n O seu saldo nao lhe permite efectuar essa operacao\n\n");
sprintf(resposta, "O seu saldo nao lhe permite efectuar essa operacao");
}
else
{
saldo = (((contas *)user)->saldo) - montant;
(((contas *)user)->saldo) = saldo;
printf("\n\n Foi efectuado um levantamento de %d euros\n\n", montant);
sprintf(resposta, "Foi efectuado um levantamento de %d euros", montant);
}
}
return;
}
void deposita_dinheiro(char *cliente, int montant)
{
int saldo;
contas *user;
user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);
if(user == NULL)
{
printf("\n\n Não existe a conta na qual pretende depositar %d euros\n\n", montant);
sprintf(resposta, "Não existe a conta na qual pretende depositar %d euros", montant);
}
else
{
saldo = (((contas *)user)->saldo) + montant;
(((contas *)user)->saldo) = saldo;
printf("\n\n Foi efectuado um deposito de %d euros\n\n", montant);
sprintf(resposta, "Foi efectuado um deposito de %d euros", montant);
}
return;
}
void cria_conta(char *cliente, int montant)
{
contas *user;
contas *temporario;
user = bsearch(cliente, conta, num_contas, sizeof(contas), compara);
if(user == NULL)
{
num_contas++;
temporario = (contas*) malloc(sizeof(contas) * num_contas);
memcpy(temporario, conta, sizeof(contas)*(num_contas - 1));
free(conta);
conta = temporario;
strcpy(conta[num_contas -1].nome, cliente);
conta[num_contas -1].saldo = montant;
}
return;
}
void listacontas(void)
{
int i = 0;
for (i = 0; i < num_contas ;i++ )
{
printf("\n | %s | %d |", conta[i].nome, conta[i].saldo);
sprintf(resposta, "| %s | %d |", conta[i].nome, conta[i].saldo);
}
return;
}
void escreve_ficheiro(void)
{
FILE *fw;
int i = 0;
fw = fopen(FILE_NAME, "w");
fprintf(fw, "%d\n", num_contas);
for(i = 0; i < num_contas; i++)
{
fprintf(fw, "%s|%d\n", conta[i].nome, conta[i].saldo);
}
return;
}
-
December 1st, 2002, 11:13 PM
#2
not much help
I've read all of your posts and have some ponters. First, if you check the vB Code help (on the screen you write your post with), it will show you a better method of placing your code in
Code:
like this
that preserves indentation
and, since your code is quite long, I'd suggest using a highlighting utility to help us read it since there are no comments. The code is simple enough (a basic client-server app), but you really should have narrowed it down to only the relevant sections and not given us the entire specifications. I understand that you are in a hurry, but you have to understand that we can help you much faster if you do the filtering of unnecessary information for us.
Also, you should have kept everything in one thread. Each thread should be a logical whole. As it is, we need to switch between threads to get the specifications and the code, and I for one can't keep all of that in my head at once. I understand that this is not the kind of help that you wanted, but it is a clarification of the kind of questions that we want. Because as is, with all code in basically c format (no object encapsulation to guide us) and no comments and no indentation, you are much less likely to get any help in the time you need it by. Plus, the large list of specifications really obscures the problems you are actually having (though I did find that area of your post)...
*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
"It's hard to believe in something you don't understand." -- the sidhi X-files episode
galathaea: prankster, fablist, magician, liar
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|