Estou implementando um programa de comunicação enviando e recebendo dados entre um server e um cliente:
Tenho um problema ao gravar os dados num ficheiro e multiplicá-los por 3.0. O programa apenas está a fazê-lo para o primeiro número guardado no ficheiro.
Isto porque ao ler os números de um ficheiro input.asc o programa está a ler como uma única mensagem, e devia ler número a número e enviar para o server.
O ficheiro input.asc pode ter qualquer número por exemplo:
1.0
2.0
3.0
Como alterar esta parte do código para ler número a número para a mensagem?
A parte do código a alterar encontra-se a castanho.
Código:
Cliente:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#define SERVER 1L
typedef struct {
long msg_to;
long msg_fm;
char buffer[BUFSIZ];
} MESSAGE;
int mid;
key_t key;
struct msqid_ds buf;
MESSAGE msg;
FILE *inFile;
int main(int argc, char** argv) {
//Aquiring Message Queue ID
key = ftok(".", 'z');
mid = msgget(key, 0);
//Display Message Queue and Client ID
printf("Message Queue ID: %d\n", mid);
printf("Client ID: %ld\n", (long)getpid());
//Opening input file, throw an error if invalid file
inFile = fopen("input.asc", "r");
if(inFile == NULL){
printf("Unable to open File = input.asc");
return 1;
}
//Copy input into msg.buffer, loops breaks when EOF is reached
int i = 0;
while(1){
msg.buffer = fgetc(inFile);
if(msg.buffer==EOF){
msg.buffer = '\0';
break;
}
i++;
}
//Displaying message before conversion of server
printf("Message before conversion:\n");
printf("%s\n", msg.buffer);
//Getting Client PID and preparing message to message queue
long iD = (long)getpid();
msg.msg_to = SERVER;
msg.msg_fm = (long)getpid();
//Send message to Message Queue for Server, throws and error for invalid input
if(msgsnd(mid, &msg, sizeof(msg.buffer), 0)==-1){
perror("msgsnd");
exit(-1);
}
//Client waits for response from Server, throws an error if invalid input
if(msgrcv(mid, &msg, sizeof(msg), iD, 0)<0){
perror("msgrcv");
exit(-1);
}
//Display new converting message.
printf("Message after conversion\n");
printf("%s\n", msg.buffer);
//Removing message queue
msgctl(mid, IPC_RMID, (struct msqid_ds *) 0);
//Client exits
return (EXIT_SUCCESS);
}
[/b]
[/color]
Server:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#define SERVER 1L
typedef struct {
long msg_to;
long msg_fm;
char buffer[BUFSIZ];
} MESSAGE;
int mid;
key_t key;
struct msqid_ds buf;
MESSAGE msg;
int inbin;
FILE *bin;
FILE *outasc;
int conta = 0;
int main(int argc, char** argv) {
//Creating a message queue
key = ftok(".", 'z');
if((mid = msgget(key, IPC_CREAT | 0660))<0){
printf("Error Creating Message Queue\n");
exit(-1);
}
//Display Message Queue and Server ID
printf("Message Queue ID: %d\n", mid);
printf("Server ID: %ld\n", (long)getpid());
//Receiving message from client, throws and error if input is invalid
if(msgrcv(mid, &msg, sizeof(msg.buffer), SERVER, 0)<0){
perror("msgrcv");
exit(-1);
}
//Aquiring Cliend PID to message return
long client = msg.msg_fm;
//Server displays received message
printf("SERVER receives:\n");
printf("%s\n", msg.buffer);
float aux=atof(msg.buffer);
printf("Conversion:%lf\n", aux);
//Creating the file input.bin
if((inbin = open("input.bin",O_WRONLY|O_TRUNC|O_CREAT,0600)) < 0)
{
perror("\nERRO NO input.bin!\n");
exit(1);
}
else
{
printf("\n File input.bin read\n");
printf("-------------------------\n\n");
int i=0;
while(msg.buffer != '\0'){
write(inbin,&aux,sizeof(float));
i++;
conta++;//NUMERO DE DADOS LIDOS
}
}
//Close the file input.bin
int closeinbin = close(inbin);
if(closeinbin < 0)
{
perror("\nERRO AO FECHAR O FICHEIRO input.bin\n");
exit(1);
}
float tab[conta];
//Open input.bin and saved the data
int readinbin = fread(&tab,sizeof(tab),1,(bin=fopen("input.bin","r")));
if(bin < 0 || readinbin < 0)
{
perror("\nOCORREU UM ERRO AO TENTAR ABRIR O FICHEIRO input.bin\n");
exit(1);
}
//Close the file input.bin
if(fclose(bin) < 0)
{
perror("\nERRO AO FECHAR input.bin!\n");
exit(1);
}
//Criar o output.asc//
if((outasc=fopen("output.asc","a")) < 0)
{
perror("ERRO AO ABRIR output.asc");
exit(1);
}
/*convert all lowercase characters to uppercase
int i;
while(msg.buffer != '\0'){
msg.buffer = toupper(msg.buffer);
i++;
}
*/
//ESCRITA NO FICHEIRO output.asc//
int a;
for(a = 0; a < conta; a++)
{
char BUFFER[20];
tab[a] = 3.0*tab[a]; //MULTIPLICAÇÃO POR 3
sprintf(BUFFER,"%f",tab[a]);
fputs(BUFFER,outasc);
fputs("\n",outasc);
printf("Wrote: %f \n",tab[a]);
}
if(fclose(outasc) < 0)
{
printf("ERRO AO FECHAR DO FICHEIRO");
exit(1);
}
//prep return message
msg.msg_fm = SERVER;
msg.msg_to = client;
//send converting message back to client, throws and error if input is invalid
if(msgsnd(mid, (struct MESSAGE*)&msg, sizeof(msg.buffer), 0)==-1){
perror("msgsnd");
exit(-1);
}
//server exits
return (EXIT_SUCCESS);
}