• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

hmrr

Ajuda para guardar dados em ficheiros !=

3 mensagens neste tópico

Olá, pedia-vos a vossa ajuda para o seguinte. Tenho um programa a funcionar por sockets, tenho o cliente e o servidor criados em c++. Tenho o cliente a enviar para o servidor o conteudo completo de um ficheiro. O servidor recebe e guarda-o. Passa-se que se eu quiser enviar mais do que um cliente, nao consigo arranjar modo de que o servidor guarde em ficheiros diferentes! Podem me dar uma ajuda? O codigo é o seguinte:

Cliente:

...

...

fp = fopen ("teste1.txt" , "r");
               if (fp == NULL)  {perror ("Erro ao abrir ficheiro");}
                else
                {
                    while ( ! feof (fp) )
                    { fgets (buffer , 200 , fp); fputs (buffer , stdout); send(hServer,buffer,falta,0);Sleep(2); //espera 2 milisegundos }
                fclose (fp);//fecha ficheiro
                memset(buffer,0,sizeof(buffer));//limpa buffer
                }
                Sleep(2); //espera dois milisegundos
//****************************************     1º ficheiro enviado ************   envio deo 2º ficheiro para o servidor        
               fp1 = fopen ("FICHEIRO DE DADOS M1.txt" , "r");
               if (fp1 == NULL)  {perror ("\n Erro ao abrir ficheiro "); }
                else
                { while ( ! feof (fp1) ) {fgets (buff , 200 , fp1);fputs (buff , stdout); send(hServer,buff,falta,0); Sleep(2); //espera 2 milisegundos}
                fclose (fp1);
                memset(buff,0,sizeof(buff));
                }

Servidor:

...

do
{

fp = fopen("FICHEIRO DE DADOS M.txt","a+");   
file = recv(hClient,buffer,falta,0);

if(file == SOCKET_ERROR)
{    
      printf("\n\n\nERRO NA RECEPCAO DE DADOS!!\n\n\n");
      memset(buffer,0,sizeof(buffer));
      break; 
}    else 
           {
           if(file == NULL)
                   {
                   memset(buffer,0,sizeof(buffer));
                   fclose(fp); 
                   break;
                   }
           }
      fprintf(fp,"%s\n",buffer);
      //rewind (fp);
      //printf("%s: %s\n",inet_ntoa(saListen.sin_addr), buffer); //imprime o endereço e os dados
      printf("Dados Recebidos: %s\n",buffer); //imprime apenas os dados
      fclose (fp);
      
        
}while(file != NULL); //aqui terminamos esse ciclo de receber dados do programa clientes

//**************primeiro ficheiro supostamente deveria terminar aqui, o que nao acontece..ou seja o 2º ficheiro que é enviado*************
//*********** continua a ser gravado neste fp apesar de o ter fechado!!****************

do
{
fp1 = fopen("FICHEIRO DE DADOS M1.txt","a+");   
file1 = recv(hClient,buff,falta,0);

if(file1 == SOCKET_ERROR)
{    
      printf("\n\n\nERRO NA RECEPCAO DE DADOS!!\n\n\n");
      memset(buff,0,sizeof(buff));
      break; 
}    else 
           {      
                  if(file1 == NULL)
                   {
                   memset(buff,0,sizeof(buff));
                   break;
                   fclose(fp1); 
                   }
           }

      fprintf(fp1,"%s\n",buff);
      printf("Dados Recebidos: %s\n",buff); //imprime apenas os dados
      fclose(fp1);
}while(file1 != NULL);

Alguma sugestao? desculpem a extensao deste post

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah parte do problema:

1- Porque é que o servidor tem código repetido? se quiseres receber de 3 clientes vais repetir o código 3 vezes?

das duas uma, ou atendes um de cada vez com o mesmo código ou lanças uma thread para atender cada pedido...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens a certeza que isto é C++? é que não vejo usares nada de C++, o código parece utilizar apenas C.

A pergunta do vitortomaz é pertinente, ainda para mais porque tens um ciclo do while cuja condição é sempre verdadeira. O fclose(fp); não coloca o valor NULL na variável fp, apenas fecha o ficheiro.

Para escrever sempre para um ficheiro diferente, uma solução é criares uma string que vai sendo alterada à medida que abres e fechas o ficheiro, com a função sprintf:

char filepath[256]; int fnumber = 0;
do {
sprintf(filepath, "FICHEIRO DE DADOS M%d.txt", fnumber++);
fp = fopen(filepath, "a+");
//...

Isto vai criar os ficheiros "FICHEIRO DE DADOS M0.txt", "FICHEIRO DE DADOS M1.txt", "FICHEIRO DE DADOS M2.txt", etc. por cada iteração do ciclo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora