Jump to content
MASTERMIND

Structs, gravação em ficheiro e uma enorme dor de cabeca :P

Recommended Posts

MASTERMIND

Boa noite pessoal, estou com uma dificuldade em entender uma parte do meu código para gravar dados de uma Struct num ficheiro na funcao alterar_socio consigo com sucesso alterar o nome do socio, mas a morada...minha nossa, mais não sair de casa  :wallbash: sempre que altero apago o registo e nada funciona...:D ..sabem dizer-me o que estou a fazer mal por favor? obrigado

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

FILE *fp;

//typedef struct{

//        char codequip[30];

//        char nome[30];

//        char data_hora[21]

//    strftime(date_time, sizeof(date_time),

//          "%m-%d-%Y  %I:%M%p\n", localtime(&current));

//  puts(date_time); 

typedef struct{

        int numero;

        char nome[30];

        char morada[60];

       

        }cliente;

       

int verifica_existe(char *nome) //Verifica se já existem clientes criados com o mesmo nome

{

cliente x;

rewind(fp);

while(!feof(fp)){

fread(&x, sizeof(cliente), 1, fp);

if(strcmp(x.nome, nome) == 0)

return 1;

}

return 0;

}

void ler_dados(cliente* p) //Pede dados ao utilizador

{

                char nome_aux[30];

              fflush(stdin);

              puts("Insira o nome do socio: "); gets(p->nome);

              strcpy(nome_aux, p->nome);

              if(verifica_existe(nome_aux)!=0){

                    printf("Nome ja existe \n");

                    exit(1);}             

                puts("Morada: "); scanf("%s",&p->morada);

                puts("Numero: "); scanf("%d",&p->numero);

                printf("Cliente inserido com sucesso \n");

                system ("Pause");

}

void alterar_socio() //Altera ficha do socio

{

    char limpa;

    scanf("%c",&limpa);

cliente x;

char nome[30];

int op;

printf("Escreva o nome \n");

gets(nome);

if(verifica_existe(nome)==0){

printf("Socio nao encontrado \n");

system ("Pause");

exit(3); }

else{

puts("(1) Alterar Nome");

puts("(2) Alterar Morada");

        scanf("%d",&op);

switch(op){

case 1: printf("Nome atual ->%s \n",nome);

printf("Escreva o novo nome \n");

scanf("%c",&limpa);

                                gets(x.nome);

fseek(fp, -sizeof(cliente), SEEK_CUR);

fwrite(&x, sizeof(cliente), 1, fp);

printf("Nome alterado com sucesso \n");

break;

case 2: printf("Morada Actual %c \n",x.morada);

printf("Escreva nova morada \n");

scanf("%c",&limpa);

                                gets(x.morada);

fseek(fp, -sizeof(cliente), SEEK_CUR);

fwrite(&x, sizeof(cliente), 1, fp);

puts("Morada alterada com sucesso");

system ("Pause");

system ("CLS");

                                break;

  }

          }

}

void ler_arquivo() //Le o ficheiro da base de dados

{       

    cliente x;

char nome[30];

fflush(stdin);

printf("Escreva o nome \n"); gets(nome);

fflush(stdin);

if(verifica_existe(nome)==0){

printf("Socio nao encontrado \n");

getch();

exit(4);

}

else{

rewind(fp); // Inicializa o apontador para o inicio do arquivo

while(!feof(fp)){

              fread(&x, sizeof(cliente), 1, fp); // lê o arquivo

              if((strcmp(x.nome, nome) == 0) && (!feof(fp))){ // procura o nome e imprime os dados

    printf("Nome: %s \n",x.nome);

    printf("Morada: %s \n",x.morada);

    printf("Numero: %d \n",x.numero);

              }

            }

}

}

void escrever_arquivo() //Escreve num arquivo a informação clientes

{

cliente x;

ler_dados(&x);

fseek(fp, 0, SEEK_END);

if(fwrite(&x, sizeof(cliente), 1, fp)!=1)

puts("Erro ao escrever no arquivo");

}

void menuclientes() //Menusocios

{

    system ("CLS");

    system ("COLOR A");

int op;

while(op!=4){

do{

printf("MENU SOCIOS \n\n");

printf("(1) Inserir novo socio \n");

printf("(2) Alterar um socio \n");

printf("(3) Procurar ficha socio \n");

printf("(4) Menu principal \n");

scanf("%d",&op);         

  } while(op<1 || op>4);

 

switch(op){

case 1: escrever_arquivo();

break;

case 2: alterar_socio();

break;

case 3: ler_arquivo();

break;

case 4: main();

break;

}

}

}

   

void menu() //Menu Principal

{

    system ("CLS");

    system ("COLOR A");

   

int op;

while(op!=4){

do{

printf("MENU PRINCIPAL \n\n");

printf("(1) Socios \n");

printf("(2) Produtos \n");

printf("(3) Alugueres \n");

printf("(4) Sair \n");

scanf("%d",&op);         

  } while(op<1 || op>4);

 

switch(op){

case 1: menuclientes();

break;

// case 2: ler_arquivo();

// break;

// case 3: alterar();

// break;

case 4: exit(5);

break;

}

}

}

       

int main(void)

{

if((fp=fopen("BD.txt","r+b"))==NULL){

printf("Erro ao abrir programa \n");

system("PAUSE");

exit(1);

}

menu();

system("PAUSE");

  return 0;

}

Share this post


Link to post
Share on other sites
Baderous

Usa as tags do GeSHi para colorir o código: [ code=c ] [ /code ] (sem os espaços)

Share this post


Link to post
Share on other sites
KTachyon

Assim de repende a olhar para o código, pareceu-me que iria ocorrer um erro caso o fseek() fosse apontado para uma posição negativa, mas depois reparei que fazes um fread() numa função que chamas no altera_socio(). Isso quer dizer que a legibilidade do teu código não é exactamente a melhor, para além de faltar a tag que indenta e coloriza o código.

Depois estás a utilizar o gets() que não é recomendado.

Para já é tudo.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

Ok, então cá vai com as tags, Baderous. @Ktachyon então se não devo usar o gets() o que devo usar então?

obrigado aos dois.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

FILE *fp;

//typedef struct{
//        char codequip[30];
//        char nome[30];
//        char data_hora[21]
//     strftime(date_time, sizeof(date_time),
//           "%m-%d-%Y  %I:%M%p\n", localtime(&current));
//  puts(date_time);   

typedef struct{
         int numero;
         char nome[30];
         char morada[60];
         
         }cliente;
         
int verifica_existe(char *nome) //Verifica se já existem clientes criados com o mesmo nome
{ 
   cliente x;
   rewind(fp);
   while(!feof(fp)){
      fread(&x, sizeof(cliente), 1, fp);
      if(strcmp(x.nome, nome) == 0)
            return 1;
            }
   return 0;
}
void ler_dados(cliente* p) //Pede dados ao utilizador
{
                char nome_aux[30];
                 fflush(stdin);
                  puts("Insira o nome do socio: "); gets(p->nome);
                  strcpy(nome_aux, p->nome);
                  if(verifica_existe(nome_aux)!=0){
                        printf("Nome ja existe \n");
                        exit(1);}                        
                puts("Morada: "); scanf("%s",&p->morada); 
                puts("Numero: "); scanf("%d",&p->numero);
                printf("Cliente inserido com sucesso \n");
                system ("Pause");
}
void alterar_socio() //Altera ficha do socio
{
    char limpa;
    scanf("%c",&limpa);
   cliente x;
   char nome[30];
   int op;
   printf("Escreva o nome \n");
   gets(nome);
   if(verifica_existe(nome)==0){
         printf("Socio nao encontrado \n");
         system ("Pause");
         exit(3);      }
   else{
         puts("(1) Alterar Nome");
         puts("(2) Alterar Morada");
           scanf("%d",&op);         
         switch(op){
                  case 1:   printf("Nome atual ->%s \n",nome);
                        printf("Escreva o novo nome \n");
                        scanf("%c",&limpa);
                                gets(x.nome);
                        fseek(fp, -sizeof(cliente), SEEK_CUR);
                        fwrite(&x, sizeof(cliente), 1, fp);
                        printf("Nome alterado com sucesso \n");
                        break;
   
                  case 2:   printf("Morada Actual %c \n",x.morada);
                        printf("Escreva nova morada \n");
                        scanf("%c",&limpa);
                                gets(x.morada);                        
                        fseek(fp, -sizeof(cliente), SEEK_CUR);
                        fwrite(&x, sizeof(cliente), 1, fp);
                        puts("Morada alterada com sucesso");
                        system ("Pause");
                        system ("CLS");
                                break;
                 }
          }
} 

void ler_arquivo() //Le o ficheiro da base de dados
{           
    cliente x;
   char nome[30];
   fflush(stdin);
   printf("Escreva o nome \n"); gets(nome);
   fflush(stdin);
   if(verifica_existe(nome)==0){
         printf("Socio nao encontrado \n");
         getch();
         exit(4);
                        }
   else{
         rewind(fp); // Inicializa o apontador para o inicio do arquivo
         while(!feof(fp)){
              fread(&x, sizeof(cliente), 1, fp); // lê o arquivo
              if((strcmp(x.nome, nome) == 0) && (!feof(fp))){ // procura o nome e imprime os dados
              printf("Nome: %s \n",x.nome);
              printf("Morada: %s \n",x.morada);
              printf("Numero: %d \n",x.numero);
              }
            }
}
}

void escrever_arquivo() //Escreve num arquivo a informação clientes
{
   cliente x;
   ler_dados(&x);
   fseek(fp, 0, SEEK_END);
   if(fwrite(&x, sizeof(cliente), 1, fp)!=1)
         puts("Erro ao escrever no arquivo");
}

void menuclientes() //Menusocios
{
    system ("CLS");
    system ("COLOR A"); 
   int op;
   while(op!=4){
   do{
      printf("MENU SOCIOS \n\n");
      printf("(1) Inserir novo socio \n");
      printf("(2) Alterar um socio \n");
      printf("(3) Procurar ficha socio \n");
      printf("(4) Menu principal \n");
      scanf("%d",&op);           
      
      } while(op<1 || op>4);
      
   switch(op){
            case 1:   escrever_arquivo();
                  break;
            case 2: alterar_socio();
                  break;
            case 3: ler_arquivo();
                  break;
            case 4: main();
                  break;
            }
            }

}
    

void menu() //Menu Principal
{
    system ("CLS");
    system ("COLOR A");
    
   int op;
   while(op!=4){
   do{
      printf("MENU PRINCIPAL \n\n");
      printf("(1) Socios \n");
      printf("(2) Produtos \n");
      printf("(3) Alugueres \n");
      printf("(4) Sair \n");
      scanf("%d",&op);           
      
      } while(op<1 || op>4);
      
   switch(op){
            case 1:   menuclientes();
                  break;
         //   case 2: ler_arquivo();
         //         break;
         //   case 3: alterar();
         //         break;
            case 4: exit(5);
                  break;
            }
            }

}
        
int main(void)
{
   if((fp=fopen("BD.txt","r+b"))==NULL){
         printf("Erro ao abrir programa \n");
         system("PAUSE");
         exit(1);
                                          }
   menu();
system("PAUSE");   
  return 0;
}

Share this post


Link to post
Share on other sites
Localhost

Deves usar por exemplo a função fgets.

fgets (my_str, SIZE, stdin);


here since 2009

Share this post


Link to post
Share on other sites
MASTERMIND

Oi, experimentei utilizadar o fgets, como sugerido mas, continuo com o mesmo erro

junto envio a parte da função alterar_socio que eu modifiquei

		switch(op){
					case 1:	printf("Nome atual ->%s \n",nome);
							printf("Escreva o novo nome \n");
							scanf("%c",&limpa);
                                fgets(x.nome, 30, stdin);
							fseek(fp, -sizeof(cliente), SEEK_CUR);
							fwrite(&x, sizeof(cliente), 1, fp);
							printf("Nome alterado com sucesso \n");
							break;
//fgets .(my_str, SIZE, stdin);
					case 2:	printf("Morada Actual %c \n",x.morada);
							printf("Escreva nova morada \n");
							scanf("%c",&limpa);
                                fgets(x.morada, 60, stdin);								
							fseek(fp, -sizeof(cliente), SEEK_CUR);
							fwrite(&x, sizeof(cliente), 1, fp);
							puts("Morada alterada com sucesso");
							system ("Pause");
							system ("CLS");
                                break;


Share this post


Link to post
Share on other sites
KTachyon

Continuo a não ver o problema, mas tenho outra correcção, que é não utilizares o system("pause"). Utiliza o getchar(). O system("pause") para além de não ser portável, é uma operação que custa "bastante" tempo de processador (faz duas mudanças de contexto).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

O problema aqui é que sempre que altero a (case: 2) morada do registo, simplesmente no arquivo BD.txt (que estou a usar como base da app) o registo desaparece, mas no caso do nome altero com sucesso (case: 1)...porque será?? se eu estou a usar o mesmo método.. :(

Share this post


Link to post
Share on other sites
KTachyon

Se calhar o problema está na leitura e não na escrita. Na função ler dados estás a dar um ponteiro para o array, em vez do array (que em si já é a localização em memória).

scanf("%s",p->morada); // não scanf("%s",&p->morada); 

E também:

printf("Morada Actual %s \n",x.morada); // não printf("Morada Actual %c \n",x.morada);

E, já agora, na função menu_clientes() estás a chamar a função main() que não está declarada anteriormente. Mas o normal é nunca chamares a função main, deves sempre derivar o teu programa a partir do main e nunca recorrer a ele.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

Ola, fiz todas as correcoes e na funcao ler_dados, mudei para gets a forma de introdução da morada, mas ainda assim continuo com o mesmo problema..

Share this post


Link to post
Share on other sites
KTachyon

Podes mostrar, para eu ter noção de como está actualmente?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

Aqui vai, Gracias Ktachyon

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

FILE *fp;
  

typedef struct{
         int numero;
         char nome[30];
         char morada[60];
      
         }cliente;
         
int verifica_existe(char *nome) //Verifica se já existem clientes criados com o mesmo nome
{ 
cliente x;
rewind(fp);
while(!feof(fp)){
	fread(&x, sizeof(cliente), 1, fp);
	if(strcmp(x.nome, nome) == 0)
			return 1;
			}
return 0;
}
void ler_dados(cliente* p) //Pede dados ao utilizador
{

                char nome_aux[30];
              	fflush(stdin);
               	puts("Insira o nome do socio: "); gets(p->nome);
               	strcpy(nome_aux, p->nome);
               	if(verifica_existe(nome_aux)!=0){
               	printf("Nome ja existe \n");
              	exit(1);}
                printf("Morada: "); 
                gets(p->morada);
                printf("Numero: "); 
                scanf("%d",&p->numero);
                printf("Cliente inserido com sucesso \n");
                getchar();
               ;  
  
}
void alterar_socio() //Altera ficha do socio
{
    char limpa;
    scanf("%c",&limpa);
cliente x;
char nome[30];
int op;
printf("Escreva o nome \n");
gets(nome);
if(verifica_existe(nome)==0){
		printf("Socio nao encontrado \n");
		getchar();
		exit(3);		}
else{
		puts("(1) Alterar Nome");
		puts("(2) Alterar Morada");
        scanf("%d",&op);			
		switch(op){
					case 1:	printf("Nome atual ->%s \n",nome);
							printf("Escreva o novo nome \n");
							scanf("%c",&limpa);
                                fgets(x.nome, 30, stdin);
							fseek(fp, -sizeof(cliente), SEEK_CUR);
							fwrite(&x, sizeof(cliente), 1, fp);
							printf("Nome alterado com sucesso \n");
							getchar();
							break;
					case 2:	printf("Morada Actual %c \n",x.morada);
							printf("Escreva nova morada \n");
							scanf("%c",&limpa);
                                fgets(x.morada, 60, stdin);								
							fseek(fp, -sizeof(cliente), SEEK_CUR);
							fwrite(&x, sizeof(cliente), 1, fp);
							puts("Morada alterada com sucesso");
							getchar();
							system ("CLS");
                                break;
				  }
          }
} 

void ler_arquivo() //Le o ficheiro da base de dados
{        	
    cliente x;
char nome[30];
fflush(stdin);
printf("Escreva o nome \n"); gets(nome);
fflush(stdin);
if(verifica_existe(nome)==0){
		printf("Socio nao encontrado \n");
		getch();
		exit(4);
							}
else{
		rewind(fp); // Inicializa o apontador para o inicio do arquivo
		while(!feof(fp)){
              fread(&x, sizeof(cliente), 1, fp); // lê o arquivo
              if((strcmp(x.nome, nome) == 0) && (!feof(fp))){ // procura o nome e imprime os dados
		     printf("Nome: %s \n",x.nome);
		     printf("Morada: %s \n",x.morada);
		     printf("Numero: %d \n",x.numero);
              }
            }
}
}

void escrever_arquivo() //Escreve num arquivo a informação clientes
{
cliente x;
ler_dados(&x);
fseek(fp, 0, SEEK_END);
if(fwrite(&x, sizeof(cliente), 1, fp)!=1)
		puts("Erro ao escrever no arquivo");
}

void menuclientes() //Menusocios
{
    system ("CLS");
    system ("COLOR A"); 
int op;
while(op!=4){
do{
	printf("MENU SOCIOS \n\n");
	printf("(1) Inserir novo socio \n");
	printf("(2) Alterar um socio \n");
	printf("(3) Procurar ficha socio \n");
	printf("(4) Menu principal \n");
	scanf("%d",&op);           

   } while(op<1 || op>4);
   
switch(op){
			case 1:	escrever_arquivo();
					break;
			case 2: alterar_socio();
					break;
			case 3: ler_arquivo();
					break;
			case 4: main();
					break;
			}
			}

}
    

void menu() //Menu Principal
{
    system ("CLS");
    system ("COLOR A");
    
int op;
while(op!=4){
do{
	printf("MENU PRINCIPAL \n\n");
	printf("(1) Socios \n");
	printf("(2) Produtos \n");
	printf("(3) Alugueres \n");
	printf("(4) Sair \n");
	scanf("%d",&op);           

   } while(op<1 || op>4);
   
switch(op){
			case 1:	menuclientes();
					break;
		//	case 2: ler_arquivo();
		//			break;
		//	case 3: alterar();
		//			break;
			case 4: exit(5);
					break;
			}
			}

}        
int main(void)
{
if((fp=fopen("BD.txt","r+b"))==NULL){
		printf("Erro ao abrir programa \n");
		system("PAUSE");
		exit(1);
													}
menu();
getchar();	
  return 0;
}

Share this post


Link to post
Share on other sites
KTachyon

Penso que te faltam alguns fflush(fp) no programa, visto que recorres frequentemente à informação que tens no ficheiro.

Depois na função que altera, não inicializas o cliente, apenas lhe dás o valor que queres alterar, os restantes é normal não aparecerem :)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

Olá depois de tentar umas 10.057 formas diferentes continuo a não conseguir alterar só os dados que quero.. 🤔. sinceramente já estou sem ideias..

Share this post


Link to post
Share on other sites
KTachyon

Lol. Mas viste aquilo que eu disse? Tens:

cliente x;
//...
fgets(x.nome, 30, stdin); //ou fgets(x.morada, 60, stdin);

Não estás a inicializar a estrutura com os dados do cliente.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

Sim isso foi o que fiz logo no inicio, mas sempre que altero o nome do cliente, apago-lhe a morada...  😲

Share this post


Link to post
Share on other sites
marciojpisidro

e como se inicializa a estrutura?

pelo que percebi em alguns posts que já li sobre alteração de dados em structs temos de ter uma espécie de ficheiro paralelo e depois copiar para o original.

mas segundo já testei com este código ele só vai escrever na morada, apagando tudo o resto.

que tipo de código vai ele utilizar para copiar toda a linha e alterar só aquele que ficar no ficheiro auxiliar?

Share this post


Link to post
Share on other sites
KTachyon

Repara, quando verificas se o sócio existe:

int verifica_existe(char *nome) //Verifica se já existem clientes criados com o mesmo nome
{ 
        cliente x;
        rewind(fp);
        while(!feof(fp)){
                fread(&x, sizeof(cliente), 1, fp);
                if(strcmp(x.nome, nome) == 0)
                                return 1;
                                }
        return 0;
}

Leste o sócio para a variável x (se existir). Quando sais da função, esse x morre, não fica em lado nenhum. Quando voltas à função alterar_socio:

void alterar_socio() //Altera ficha do socio
{
    char limpa;
    scanf("%c",&limpa);
        cliente x; // cliente x não inicializado!!!!!
        char nome[30];
        int op;
        printf("Escreva o nome \n");
        gets(nome);
        if(verifica_existe(nome)==0){ // Não retornas o x que encontraste na função de verificação!!!!
                        printf("Socio nao encontrado \n");
                        getchar();
                        exit(3);                }
        else{
                        puts("(1) Alterar Nome");
                        puts("(2) Alterar Morada");
                scanf("%d",&op);                        
                        switch(op){
                                                case 1: printf("Nome atual ->%s \n",nome);
                                                                printf("Escreva o novo nome \n");
                                                                scanf("%c",&limpa);
                                fgets(x.nome, 30, stdin); // x não tem nada, excepto o nome que colocas!!!!!
                                                                fseek(fp, -sizeof(cliente), SEEK_CUR);
                                                                fwrite(&x, sizeof(cliente), 1, fp);
                                                                printf("Nome alterado com sucesso \n");
                                                                getchar();
                                                                break;
                                                case 2: printf("Morada Actual %c \n",x.morada);
                                                                printf("Escreva nova morada \n");
                                                                scanf("%c",&limpa);
                                fgets(x.morada, 60, stdin);  // x não tem nada, excepto a morada que colocas!!!!!                                                           
                                                                fseek(fp, -sizeof(cliente), SEEK_CUR);
                                                                fwrite(&x, sizeof(cliente), 1, fp);
                                                                puts("Morada alterada com sucesso");
                                                                getchar();
                                                                system ("CLS");
                                break;
                                          }
          }
}

Ou seja, tens que retornar o x, para manteres os valores. Ou então envias o ponteiro para a função que verifica, para que fiques com o x preenchido com o que está em ficheiro.

int verifica_existe(char *nome, cliente *x) //Verifica se já existem clientes criados com o mesmo nome
{ 
        rewind(fp);
        while(!feof(fp)){
                fread(x, sizeof(cliente), 1, fp);
                if(strcmp(x->nome, nome) == 0)
                                return 1;
                                }
        return 0;
}

if (verifica_existe(nome, &x)==0) {


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
MASTERMIND

... :(..Não funciona, agora a função pede parâmetros e por na função ler dados não tenho essa informação porque x e nome do socio é a mesma coisa ou não?  :dontgetit:

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.