jluis Posted June 24, 2012 at 06:19 PM Report Share #465245 Posted June 24, 2012 at 06:19 PM (edited) boas... eu a desenvolver um programa para fazer um género de leiloes, tem o programa servidor e o cliente, para ligar isto estou a usar pipes, mas estou com um problema ao gravar os estruturas no ficheiro, o fprintf não esta a fazer o que devia... alguem sabe o porque? programa clientes.c #include <sys/types.h> #include <signal.h> #include <stdio.h> #include <ctype.h> #include <time.h> #include <termios.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include "clientserver.h" #define max 20 int data_si(int Dia,int Mes,int Ano) // data do sistema { struct tm *local; time_t t; t= time(NULL); local=localtime(&t); Dia=local->tm_mday; Mes=local->tm_mon+1; Ano=local->tm_year+1900; } //------------------- fim geral --------------------------------// //------------------- inicio artigo ----------------------------// int Inserir( ) { int i,j; for (i=1;i<=19;i++) { if (i!=msg.arte[i].num_art) { msg.arte[i].num_art=i; break; } } msg.arte[i].num_uti=msg.uti[i].num_uti; printf("Qual o Nome?\n"); scanf("%*[^\n]"); scanf("%*c"); gets(msg.arte[i].nome); for(j=0;j<=strlen(msg.arte[i].nome);j++) { tolower(msg.arte[i].nome[j]); } printf("Qual o Preço?\n"); scanf("%d",&msg.arte[i].preco); printf("Descrição: \n"); scanf("%*[^\n]"); scanf("%*c"); gets(msg.arte[i].descricao); data_si(msg.arte[i].inicio.dia, msg.arte[i].inicio.mes, msg.arte[i].inicio.ano); } int Mostrar( ) { int i; if(ficheiros.co==0) { printf("nao existe dados\n"); } for (i=1;i<=max;i++) { printf("----------------------------------------------------------0\n"); printf("Numero : %d\n", msg.arte[i].num_art); printf("Nome : %s\n", msg.arte[i].nome); printf("Preço : %d\n", msg.arte[i].preco); printf("descrição : %s\n", msg.arte[i].descricao); if(msg.arte[i].num_uti==msg.uti[i].num_uti) { printf("Nome do msg.utilzador : %s\n", msg.uti[i].nome); } printf("Dt. Inicio : %d/%d/%d\n", msg.arte[i].inicio.dia,msg.arte[i].inicio.mes,msg.arte[i].inicio.ano); printf("Dt. Fim : %d/%d/%d\n", msg.arte[i].fim.dia,msg.arte[i].fim.mes,msg.arte[i].fim.ano); printf("----------------------------------------------------------1\n\n"); } sleep(10); } int Editar() { char art[100]; int i; printf("Qual o nome do artigo?\n"); scanf("%*[^\n]"); scanf("%*c"); gets(art); for(i=0;i<=strlen(art);i++) { tolower(art[i]); } for (i=0;i<=max;i++) { if (strcmp(art,msg.arte[i].nome)==0) { printf("Qual o Preço?\n"); scanf("%d",&msg.arte[i].preco); printf("Descrição: \n"); scanf("%*[^\n]"); scanf("%*c"); gets(msg.arte[i].descricao); } else { printf("Não existe esse artigo!\n"); sleep(5); break; } } } //------------------- fim artigo -------------------------------// //------------------- inicio leilao ----------------------------// int in_leilao() { int dia, mes, ano,i,conta; char name[100],b; printf("Qual o Nome?\n"); scanf("%*[^\n]"); scanf("%*c"); gets(name); for(i=0;i<=strlen(name);i++) { tolower(name[i]); } for (i=1;i>=ficheiros.co;i++) { if (strcmp(name,msg.arte[i].nome)==0) { conta=i; } else{ conta=0; } if(conta!=0){ printf("Pelo mesmo preço?\n"); scanf("%c",&b); if(b=='n'|| b=='N') { printf("Qual o novo preço?\n"); scanf("%d",&msg.arte[i].preco); } else { data_si(msg.arte[i].inicio.dia, msg.arte[i].inicio.mes, msg.arte[i].inicio.ano); dia==msg.arte[i].inicio.dia; mes==msg.arte[i].inicio.mes; ano==msg.arte[i].inicio.ano; if(mes==2 && dia==28) { mes++; dia=dia+8; } else { if(mes==1 || 3 || 5 || 7 || 8 || 10 || 12 && dia==31) { mes++; dia=dia+8; } else { if(mes==4 || 6 || 9 || 11 && dia==30) { mes++; dia=dia+8; } else { if(mes==12 && dia==31) { dia=dia+8; mes=1; ano++; } else { dia=dia+8; } } } } msg.arte[i].fim.dia=dia; msg.arte[i].fim.mes=mes; msg.arte[i].fim.ano=ano; msg.arte[i].emleilao='s'; return; } } else { printf("Não existe esse artigo!"); } } } int fim_leilao() { char art[100],b; int i; printf("Qual o nome do artigo?\n"); scanf("%*[^\n]"); scanf("%*c"); gets(art); for(i=0;i<=strlen(art)-1;i++) { tolower(art[i]); } for (i=0;i<=ficheiros.co;i++) { if (strcmp(art,msg.arte[i].nome)==0) { printf("Deseja finalizar o leilao?\n"); scanf("%s",&b); if(b=='s'|| b== 'S') { msg.arte[i].emleilao='n'; } } else { printf("Não existe esse artigo!"); } } } int lis_leilao( ) { int i; for (i=1;i<=ficheiros.co;i++) { if(msg.arte[i].num_uti==msg.uti[i].num_uti) { if(msg.arte[i].emleilao="s"||"S") { printf("Numero : %d\n", msg.arte[i].num_art); printf("Nome : %s\n", msg.arte[i].nome); printf("Preço : %d\n", msg.arte[i].preco); printf("descrição : %s\n", msg.arte[i].descricao); printf("Nome do msg.utilizador : %s\n", msg.uti[i].nome); printf("Dt. Inicio : %d/%d/%d\n", msg.arte[i].inicio.dia,msg.arte[i].inicio.mes,msg.arte[i].inicio.ano); printf("Dt. Fim : %d/%d/%d\n", msg.arte[i].fim.dia,msg.arte[i].fim.mes,msg.arte[i].fim.ano); } } } sleep(5); } //------------------- fim leilao -------------------------------// //------------------- inicio msg.utilizadores ----------------------// int Ins_artes() { int i; for (i=1;i<=ficheiros.co;i++) { if (i!=msg.uti[i].num_uti) { msg.uti[i].num_uti=i; } } printf("Qual o Nome?\n"); scanf("%*[^\n]"); scanf("%*c"); gets(msg.uti[i].nome); tolower(msg.uti[i].nome[i]); printf("Qual a data de Nascimento?\n"); scanf("%d %d %d",&msg.uti[i].nasc.dia, &msg.uti[i].nasc.mes, &msg.uti[i].nasc.ano); } int edi() { char art[100]; int i, n; printf("Qual o numero?\n"); scanf("%d",&n); for (i=0;i<=ficheiros.co;i++) { if (n==msg.uti[i].num_uti) { printf("Qual o nome?"); scanf("%*[^\n]"); scanf("%*c"); gets(msg.uti[i].nome); tolower(msg.uti[i].nome[i]); printf("Qual a data de Nascimento?\n"); scanf("%d %d %d",&msg.uti[i].nasc.dia, &msg.uti[i].nasc.mes, &msg.uti[i].nasc.ano); } else { printf("Não existe esse artigo!"); } } } int lis_art_ven( ) { int i; for (i=1;i<=ficheiros.co;i++) { if(msg.arte[i].num_uti==msg.uti[i].num_uti) { printf("Numero : %d\n", msg.arte[i].num_art); printf("Nome : %s\n", msg.arte[i].nome); printf("Preço : %d\n", msg.arte[i].preco); printf("descrição : %s\n", msg.arte[i].descricao); printf("Dt. Inicio : %d/%d/%d\n", msg.arte[i].inicio.dia,msg.arte[i].inicio.mes,msg.arte[i].inicio.ano); printf("Dt. Fim : %d/%d/%d\n", msg.arte[i].fim.dia,msg.arte[i].fim.mes,msg.arte[i].fim.ano); } } sleep(5); } //------------------- fim msg.utilizadores -------------------------// //------------------- inicio fifos -------------------------// void fifos(int server_tunel,char clfifo[255]) { int client_tunel; printf("fifo\n"); if (server_tunel != -1) { write(server_tunel, &msg, sizeof(msg)); } client_tunel = open(clfifo, O_RDONLY|O_NONBLOCK); if (client_tunel!= -1) { read(SERVER_FIFO, &msg, sizeof(msg)); } } int acc(int server_tunel,char clfifo[255]) { char user[100], pass[100],b; int i; printf("nome do utilizador: "); scanf("%*[^\n]"); scanf("%*c"); gets(user); printf("password: "); gets(pass); for (i=0;i<=ficheiros.couti;i++) { if(strcmp(user,msg.uti[i].nome)!=0) { strcpy(user,msg.uti[i].nome); strcpy(pass,msg.uti[i].pass); } } msg.msget=2; fifos(server_tunel,clfifo); } int login(int server_tunel,char clfifo[255]) { char user[100], pass[100],b; int i; printf("ja tem conta?"); scanf("%s",&b); if(b=='n'|| b== 'N') { acc(server_tunel,clfifo); } else{scanf("%*[^\n]"); scanf("%*c");} printf("Username: "); gets(user); printf("Password: "); gets(pass); for (i=0;i<=ficheiros.couti;i++) { if(strcmp(user,msg.uti[i].nome)!=0 && strcmp(pass,msg.uti[i].pass)!=0) { printf("utilizador ou pass invalido"); } else { printf("Bem vindo %s", user); return; } } } //------------------- fim fifos -------------------------// //------------------- inicio submenus -------------------------// //------------------- fim submenus -------------------------// int main() { int op; int server_tunel,client_tunel; char clfifo[255]; msg.client_pid = getpid(); sprintf(clfifo,CLIENT_FIFO,msg.client_pid); printf("as %d\n\n",msg.client_pid); server_tunel = open(SERVER_FIFO, O_WRONLY); if (server_tunel == -1) { fprintf(stderr, "Sorry, no server\n"); exit(EXIT_FAILURE); } if (mkfifo(clfifo, 0777) == -1) { fprintf(stderr, "Sorry, can't make %s\n", CLIENT_FIFO); exit(EXIT_FAILURE); } login(server_tunel,clfifo); while(1) { system("clear"); printf("1 - intruduzir artigo\n"); printf("2 - vender artigo\n"); printf("3 - comprar artigo(fazer)\n"); printf("4 - listar todos os artigo em leilao\n"); printf("5 - meus artigo vendidos\n"); printf("6 - meus artigo comprados(fazer)\n"); printf("7 - sair\n"); scanf("%d",&op); switch(op) { case 1:{into(server_tunel,clfifo);break;} case 2:{vender(server_tunel,clfifo);break;} case 3:{break;} case 4:{lis_leilao();break;} case 5:{lis_art_ven();break;} case 6:{break; fifos(server_tunel,clfifo);} case 7:{exit(0);} } } close(client_tunel); unlink(CLIENT_FIFO); } int vender( int server_tunel,char clfifo[255]) { int sp; while(1){ system("clear"); printf("1 - vender novo artigo\n"); printf("2 - vender ja\n"); printf("3 - voltar atraz\n"); scanf("%d",&sp); switch(sp) { case 1: in_leilao(); msg.msget=3; fifos(server_tunel,clfifo); break; case 2: fim_leilao(); msg.msget=3; fifos(server_tunel,clfifo); break; case 3: return; } } } int into(int server_tunel,char clfifo[255]) { int sp,i; while(1){ system("clear"); printf("1 - intruduzir novo artigo\n"); printf("2 - Editar artigo\n"); printf("3 - Mostrar artigo\n"); printf("4 - voltar atraz\n"); scanf("%d",&sp); switch(sp) { case 1: Inserir(); msg.msget=3; fifos(server_tunel,clfifo); break; case 2: Editar(); msg.msget=3; fifos(server_tunel,clfifo); break; case 3: system("clear"); Mostrar(); break; case 4: return; } } } ficheiro clientserv.h #include <sys/types.h> #include <signal.h> #include <ctype.h> #include <time.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <limits.h> #include <sys/stat.h> #define SERVER_FIFO "/tmp/serv_fifo" #define CLIENT_FIFO "/tmp/cli_%d_fifo" typedef struct {int dia,mes,ano;}DATA; struct artigo { int num_art; int num_uti; char nome[100]; int preco; char descricao[500] ; char emleilao; DATA inicio; DATA fim; } artigo; struct utilizadores { int num_uti; char nome[100]; char pass[100]; DATA nasc; } utilizadores; struct ficheiros { int co, couti; }ficheiros; struct msg { int client_pid; int msget; struct utilizadores uti[40]; struct artigo arte[40]; int off; }msg; ficheiro serverv3.c #include <sys/types.h> #include <signal.h> #include <stdio.h> #include <ctype.h> #include <time.h> #include <errno.h> #include "clientserver.h" //------------------- inicio geral -----------------------------// void TrataSinal(int signal) { printf("[Trata] Processo %d a tratar o sinal %d...\n", getpid(), signal); } int data_si(int Dia,int Mes,int Ano) /* data do sistema*/ { struct tm *local; time_t t; t= time(NULL); local=localtime(&t); Dia=local->tm_mday; Mes=local->tm_mon+1; Ano=local->tm_year+1900; } void ler_uti() { FILE *ut; int i, conta ,el ,ca ; ut = fopen("utilizadores.txt","a+"); if(ut==NULL) { printf("Impossivel abrir o ficheiro!"); exit(1); } else { for(i=1;i>=40;i++){ fscanf(ut,"%d\n %s\n %d\n %d\n %d\n",&msg.uti[i].num_uti,msg.uti[i].nome,&msg.uti[i].nasc.dia, &msg.uti[i].nasc.mes, &msg.uti[i].nasc.ano); } } i=0; conta=0; while((ca = fgetc(ut)) != EOF) { el= 1; // há conteúdo no arquivo if(ca == '\n') { // é uma quebra de linha? // vamos incrementar a quantidade de linhas conta++; } } ficheiros.couti=conta; } void gravar_uti() { FILE *ut; int i; ut = fopen("utilizadores.txt","a+"); if(ut==NULL) { printf("Impossivel abrir o ficheiro!"); exit(1); } else { } for(i=1;i>=20;i++){ if(msg.uti[i].num_uti!=0) { fprintf(ut,"%d\n %s\n %d\n %d\n %d\n",msg.uti[i].num_uti,msg.uti[i].nome,msg.uti[i].nasc.dia, msg.uti[i].nasc.mes, msg.uti[i].nasc.ano); } } } void ler_art() { FILE *at; int i; at = fopen("artigos.txt","a+"); if(at==NULL) { printf("Impossivel abrir o ficheiro!"); exit(1); } else { for(i=1;i>=40;i++){ fscanf(at,"%d\n %d\n %s\n %d\n %s\n %c\n %d\n %d\n %d\n %d\n %d\n %d\n",&msg.arte[i].num_art,&msg.arte[i].num_uti,msg.arte[i].nome,&msg.arte[i].preco,msg.arte[i].descricao,msg.arte[i].emleilao,&msg.arte[i].inicio.dia,&msg.arte[i].inicio.mes, &msg.arte[i].inicio.ano, &msg.arte[i].fim.dia, &msg.arte[i].fim.mes, &msg.arte[i].fim.ano); } } int conta=0; char curr; //prev variable is included to exclude multiple spaces. while((fscanf(at,"%c",&curr))!=EOF) { if (curr=='\n') conta++; } ficheiros.co=conta; } void gravar_art() { FILE *at; int i; printf("control 6 \n"); at = fopen("artigos.txt","a+"); if(at==NULL) { printf("Impossivel abrir o ficheiro!"); exit(1); } else { for (i=1;i<=2;i++) { printf("----------------------------------------------------------0\n"); printf("Numero : %d\n", msg.arte[i].num_art); printf("Nome : %s\n", msg.arte[i].nome); printf("Preço : %d\n", msg.arte[i].preco); printf("descrição : %s\n", msg.arte[i].descricao); if(msg.arte[i].num_uti==msg.uti[i].num_uti) { printf("Nome do utilzador : %s\n", msg.uti[i].nome); } printf("Dt. Inicio : %d/%d/%d\n", msg.arte[i].inicio.dia,msg.arte[i].inicio.mes,msg.arte[i].inicio.ano); printf("Dt. Fim : %d/%d/%d\n", msg.arte[i].fim.dia,msg.arte[i].fim.mes,msg.arte[i].fim.ano); printf("----------------------------------------------------------1\n\n"); } printf("control 7 \n"); for(i=1;i<=40;i++){ if(msg.arte[i].num_art!=0) { printf("control 8 \n"); fprintf(at,"%d\n %d\n %s\n %d\n %c\n %c\n %d\n %d\n %d\n %d\n %d\n %d\n",msg.arte[i].num_art,msg.arte[i].num_uti,msg.arte[i].nome,msg.arte[i].preco,msg.arte[i].descricao,msg.arte[i].emleilao,msg.arte[i].inicio.dia,msg.arte[i].inicio.mes, msg.arte[i].inicio.ano, msg.arte[i].fim.dia, msg.arte[i].fim.mes, msg.arte[i].fim.ano); printf("control 8 %d \n",i); } } } } //------------------- fim geral --------------------------------// /*void ouch(int sig) { printf("OUCH! − I got signal %d\n", sig); }*/ main() { int server_tunel, client_tunel,i, read_res,filho, ret, status,clpid; char clfifo[255]; pid_t pid; filho=0; /* struct sigaction act; act.sa_handler = ouch; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGINT, &act, 0);*/ ler_art(); ler_uti(); printf("Bem vindo ao leilao servidor\n"); printf("Carregando dados\n"); printf("Carregamento concluido, para desligar o servidor basta fechar esta janela\n"); ret = mkfifo(SERVER_FIFO, 0777); if (ret == -1 && errno!=EEXIST) { fprintf(stderr, "Falha no pipe\n"); exit(EXIT_FAILURE); } if (ret == -1 && errno==EEXIST) { fprintf(stderr, "server ja existe\n"); exit(EXIT_FAILURE); } server_tunel = open(SERVER_FIFO, O_RDONLY); if (server_tunel == -1) { fprintf(stderr, "Server fifo failure\n"); exit(EXIT_FAILURE); } read_res==0; do { switch((pid=fork())) { case -1: /* Erro no fork */ perror("[Erro] Fork..."); exit(EXIT_FAILURE); case 0: /* Processo filho */ /*if (signal(SIGINT, TrataSinal)==SIG_ERR) { fprintf(stderr, "[Erro] A redirecionar sinal! (%d)\n", SIGINT); exit(1); }*/ do { read_res = read(server_tunel, &msg, sizeof(struct msg)); printf("control 3A leitura pipe server \n"); printf("%d msg",msg.msget); if(read_res<0) {printf("erro");exit(1);} if (read_res > 0) { switch(msg.msget); { case 2:gravar_uti();break; case 3:gravar_art();printf("control 9 \n"); } printf("control 10 \n"); sprintf(clfifo,CLIENT_FIFO,msg.client_pid); printf("as %s\n",clfifo); client_tunel = open(clfifo, O_WRONLY); printf("as %d\n",client_tunel); if (client_tunel != -1) { printf("tunel\n"); write(client_tunel, &msg, sizeof(struct msg)); close(client_tunel); } } else {printf("nada\n");printf("nada\n");printf("nada\n");printf("nada\n");} }while (read_res >=0); filho=1; break; default: /* Processo pai */ wait(&status); //if(WIFSIGNALED(status)) //printf("[Pai] O meu filho terminou devido ao sinal %d que lhe enviei...\n", WTERMSIG(status) ); if(WIFEXITED(status)) printf("[Pai] O meu Filho terminou devido ao exit(%d)...\n", WEXITSTATUS(status) ); } }while(!filho); close(server_tunel); unlink(SERVER_FIFO); } esta aqui todo o codigo feito... cumprs e bem haja aos criadoes deste forum... Edited July 2, 2012 at 11:38 PM by Baderous geshi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 25, 2012 at 07:34 AM Report Share #465292 Posted June 25, 2012 at 07:34 AM antes de sequer olhar para essas linhas de código todas tens de dar mais informação - o que deveria o fprintf fazer - o que acontece - onde acontece IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now