Jump to content
Fórum Script Brasil
  • 0

[Arquivo] Escrevendo uma agenda


Thiago Mendes

Question

Bom,tenho que fazer um trabalho pra escola que é fazer uma Agenda Eletronica em C usando arquivo. Estou conseguindo fazer o código e tudo mais,porém estou com um erro na hora de escrever no arquivo.

Meu professor não ensinou arquivo,nem as funções nem nada,só mandou a gente fazer o trabalho. O que tá acontecendo é que eu só consigo escrever 1 nome no arquivo e não vários,creio que o problema esteja na função escrevearquivo(),segue o código,sendo que estou na primeira opção ainda,as outras não comecei a programar,pois preciso fazer com que a funcao de certo. =] Desde já,muito obrigado. Preciso de ajuda o quanto antes,obrigado. Abraços

Obs.: A formatação não está das melhores,mas isso é culpa do DevC++ ;p

#include <stdio.h>
struct ag{
       char nome[100],ende[100],email[100];
       int tel,cel,comer,id;
};
struct ag agenda;
FILE *arq;
int op;
void menu(){
            printf("Bem vindo a agenda eletronica! Aperte:\n 1 - Inserir um nome \n 2 - Listagem de todos os nomes \n 3 - Consulta de dados (Por nome) \n 4 - Remocao de um nome \n 5 - Quantidade de nomes inicializados com cada letra do alfabeto \n 0 - Para fechar o programa\nOpcao: ");
            scanf("%d",&op);
            while(!((op==0)||(op==1)||(op==2)||(op==3)||(op==4)||(op==5))){
                                                                           printf("Erro! Opcao invalida,entre com um valor valido por favor:\n");
                                                                           scanf("%d",&op);
            }
}

void dados(){
     int op1,op2;
     printf("Entre com o nome:\n");
     scanf("%s",&agenda.nome);
     printf("Por favor entre com o telefone:\n");
     scanf("%d",&agenda.tel);
     printf("Gostaria inserir mais dados? (0 - 1)\n");
     scanf("%d",&op1);
     if(op1){
             printf("Gostaria de entrar com o Telefone Celular? (0 - 1)\n");
             scanf("%d",&op2);
             if(op2){
                     printf("Tel. Celular: ");
                     scanf("%d",&agenda.cel);
                     }
             printf("Gostaria de entrar com o Telefone Comercial? (0 - 1)\n");
             scanf("%d",&op2);
             if(op2){
                     printf("Tel. Comercial: ");
                     scanf("%d",&agenda.comer);
                     }
             printf("Gostaria de entrar com o Endereco? (0 - 1)\n");
             scanf("%d",&op2);
             if(op2){
                     printf("Endereco: ");
                     scanf("%s",&agenda.ende);
                     }
             printf("Gostaria de entrar com o e-mail? (0 - 1)\n");
             scanf("%d",&op2);
             if(op2){
                     printf("E-mail: ");
                     scanf("%s",&agenda.email);
                     }
             }
}

void escrevearquivo(){
     //arq = fopen("agenda.bin","wb+");
     //fseek(arq, ftell(arq), SEEK_CUR);
     fwrite(&agenda, sizeof(agenda), 1, arq);
     //fflush(stdin);
     //fclose(arq);
}

void imprimiarquivo(){
     arq = fopen("agenda.bin","rb+");
     //while(fread(&agenda, sizeof(agenda), 1, arq))
     fread(&agenda, sizeof(agenda), 1, arq);
     while(!feof(arq)){
                          printf("Nome: %s \nTelefone: %d \nCelular: %d \nComercial: %d \nEndereco:%s \nEmail:%s \n",agenda.nome, agenda.tel, agenda.cel, agenda.comer, agenda.ende, agenda.email);
                          fread(&agenda, sizeof(agenda), 1, arq);
                          }
     fclose(arq);
}


main(){
       if((arq = fopen("agenda.bin","wb+")) == NULL )
               printf("Erro ao criar arquivo.");
       menu();
       while(op){
                if(op==1){
                          //if(feof(arq)!=0){'
                                           //printf("\n Primeiro nome!!");
                                           dados();
                                           escrevearquivo();
                                           //imprimiarquivo();
                                           system("cls");
                                           menu();                                         
                          }

                } 
       getch();
}

Edited by Thiago Mendes
Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

Basta trocar a flag "wb+" que apaga o conteúdo do arquivo sempre que escreve alguma coisa nova pela flag "a+" que mantém o conteúdo do mesmo quando grava informações.

Att.,

Pedro

Link to comment
Share on other sites

  • 0

Bom, o que você pode fazer (acho que é um método meio "feio") é definir cada letra com um número e depois, com um laço for, ver qual é a primeira letra de cada palavra, com isso, atribuindo um valor a essa palavra. Após isso, basta ordenar as palavras seguindo seus valores. Acho que com o strcmp também deve ser possível fazer isso, usando da mesma lógica.

Att.,

Pedro

Link to comment
Share on other sites

  • 0

Tinha funcionado agora não está mais funcionando =/ Você diz colocar "a+" na funcao escrevearquivo,certo?!

O problema foi que a partir de um certo ponto de nomes na agenda,ela começou a bugar. Os nomes que eu inseria não iam direito,ficavam espaços vazios,só ia o número celular. E o imprimiarquivo não está indo até o final do arquivo,ai eu fui mexendo mexendo no programa e pronto,agora não está mais funcionando como antes =/

Link to comment
Share on other sites

  • 0

Sim. Provavelmente foi alguma mudança que você fez. Abra duas "abas" diferentes e coloque em uma o código antigo, funcional e na outra, coloque o novo código e compare os dois. Caso não dê certo, tente mudar o formato do arquivo para .txt, invés de .bin. Particularmente, acho mais fácil de manipular.

Att.,

Pedro

Link to comment
Share on other sites

  • 0

Entendi. Olha, para deletar um nome, é um pouco complicado. O que eu fiz quando precisei fazer isso, e você pode ver neste link aqui PROGRAMA PARA CADASTRO foi criar um novo arquivo toda vez que eu queria alterar alguma coisa no arquivo antigo. Da seguinte forma: para o arquivo novo, usando um if (ou strcmp no seu caso) eu passava tudo do arquivo velho, menos o que seria deletado. E após fazer isso, renomeava o arquivo novo com o nome do arquivo velho e deletava o arquivo velho. Acho que deve funcionar para você. Dê uma olhada no link que postei e veja se entende a lógica do programa. É um programa de cadastro completo, e vai te ajudar muito. Qualquer dúvida, é só perguntar.

A dica da ordenação funcionou?

Att.,

Pedro

Edited by PedroCunha
Link to comment
Share on other sites

  • 0

Eu vou tentar usar essa ideia também, ainda nem consegui chegar na parte de ordenar ;/ A função para escrever no arquivo não está funcionando direito,tem hora que ela escreve,tem hora que não,não estou entendendo e a função de printar a mesma coisa,você poderia dar uma olhada por favor?!

Tentei entender seu código,mas ele está meio complicado pra mim hahahah mas estou vendo o que consigo aproveitar dele ;]

void escrevearquivo(){
     //arq = fopen("agenda.bin","wb+");
     fwrite(&agenda, sizeof(agenda), 1, arq);
     fflush(arq);
     //fclose(arq);
}

void imprimiarquivo(){
     arq = fopen("agenda.bin","rb+");
     fread(&agenda, sizeof(agenda), 1, arq);
     while(!feof(arq)){
                          printf("Nome: %s \nTelefone: %d \nCelular: %d \nComercial: %d \nEndereco:%s \nEmail:%s \n\n",agenda.nome, agenda.tel, agenda.cel, agenda.comer, agenda.ende, agenda.email);
                          fread(&agenda, sizeof(agenda), 1, arq);
                          }
     fclose(arq);
}

Eu coloquei o arq = fopen("agenda.bin","wb+"); e o fclose(arq); por que achei que eles estivessem abrindo e apagando o arquivo,mas posso estar errado,gostaria de sua ajuda enquanto a isso. E o fflush,seria para quando o usuário entrasse com um nome, e em seguida pedisse a listagem da Agenda não tivesse que fechar e abrir o programa,mas não tenho certeza se está funcionando. E o erro que não estou conseguindo entender de jeito nenhum é isso da função escrever não funcionar direito,tem hora que eu tento entrar com um contato e não dá certo,ai eu fecho e abro o programa , dai eu consigo escrever, sabe o que pode ser?!

Ah e a partir de um certo ponto a função copia o número do tel,mas o nome não. Quando abro o arquivo .bin no notepad dá pra ver os nomes escritos, e tá lá o nome,mas na hora de imprimir não aparece ;/ Completamente sem sentido uhahuauh

Link to comment
Share on other sites

  • 0

Olha Thiago, você me pegou agora. C realmente não é meu forte, então não entendo muito bem sobre como escrever em arquivos em C, principalmente usando binários. Então o que posso fazer é te dar dicas de lógica. Na função de leitura, você provavelmente está passando algum parâmetro errado ou está se esquecendo de abrir e fechar o arquivo antes, ou passar o ponteiro para o início do arquivo, para ele poder ler todo o conteúdo. Na função de gravar, é provável que seja a mesma coisa. Sinto muito não poder ajudar mais; se fosse em C++, seus problemas estariam resolvidos, :(. Mas tenho certeza que logo logo algum expert em C aqui do fórum vem te ajudar. Qualquer dúvida referente à lógica fique a vontade para me perguntar e também para usar o código que te passei de base.

Att.,

Pedro

Link to comment
Share on other sites

  • 0

#include <stdio.h>
#include <stdlib.h> //exit()
struct ag{
       char nome[100];
       char ende[100];
       char email[100];
       int tel;
       int cel;
       int comer;
       int id;
};
typedef struct ag Agenda; //para ficar melhor a compreensão
Agenda agenda;
FILE *arq;
int op;

void menu(){
            printf("Bem vindo a agenda eletronica! Aperte:\n 1 - Inserir um nome \n 2 - Listagem de todos os nomes \n 3 - Consulta de dados (Por nome) \n 4 - Remocao de um nome \n 5 - Quantidade de nomes inicializados com cada letra do alfabeto \n 0 - Para fechar o programa\nOpcao: ");
            scanf("%d",&op);
            while(op < 0 && op > 5){//bem melhor do que aquela lógica
                printf("Erro! Opcao invalida,entre com um valor valido por favor:\n");
                scanf("%d",&op);
            }
}

void dados(){
     int op1,op2;
     printf("Entre com o nome:\n");
     gets(agenda.nome);//Use isso senão vai ocorrer seus erros descritos no tópico
     printf("Por favor entre com o telefone:\n");
     scanf(" %d", &agenda.tel);
     printf("Gostaria inserir mais dados? (0 - 1)\n");
     scanf(" %d",&op1);//Um espaço antes auxilia o scanf a não pegar lixo em buffers
     if(op1){
             printf("Gostaria de entrar com o Telefone Celular? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Tel. Celular: ");
                     scanf(" %d",&agenda.cel);
                     }
             printf("Gostaria de entrar com o Telefone Comercial? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Tel. Comercial: ");
                     scanf(" %d",&agenda.comer);
                     }
             printf("Gostaria de entrar com o Endereco? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Endereco: ");
                     gets(agenda.ende);
                     }
             printf("Gostaria de entrar com o e-mail? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("E-mail: ");
                     gets(agenda.email);
                     }
             }
}

void escrevearquivo(){
     arq = fopen("agenda.bin","ab");//já inicia no final do arquivo
     if(arq == NULL){//teste nem sempre você tera permissão para abrir um qruivo
        printf("Erro ao abrir arquivo!\n");
        exit(1); //termina seu programa
     }
     if(fwrite(&agenda, sizeof(Agenda), 1, arq) != 1){//teste para ver se escreveu os dados no arquivo
        printf("Erro ao escrever no arquivo!\n");
        exit(2);
     }
     fclose(arq);
}

void imprimiarquivo(){
     arq = fopen("agenda.bin","rb");
     if(arq == NULL){
        printf("Erro ao abrir arquivo!\n");
        exit(1);
     }
     //enquanto fo lido certo ou não seja o final do arquivo
     while(fread(&agenda, sizeof(agenda), 1, arq) == 1 && !feof(arq)){
        printf("Nome: %s \nTelefone: %d \nCelular: %d \nComercial: %d \nEndereco:%s \nEmail:%s \n",agenda.nome, agenda.tel, agenda.cel, agenda.comer, agenda.ende, agenda.email);
        fread(&agenda, sizeof(agenda), 1, arq);
    }
    fclose(arq);
}

Agora seu main() abre e não fecha "arquivos.bin" ai você quer abrir o mesmo arquivo em outra função? Isso vai causar perda de dados. se fosse você pensava um pouco na função menu(), transforme em main() e implemente mais alguma coisa para seu algoritmo funcionar. Ou use o retorna da função menu como int.

Edited by Dan Oliveira
Link to comment
Share on other sites

  • 0
Olha Thiago, você me pegou agora. C realmente não é meu forte, então não entendo muito bem sobre como escrever em arquivos em C, principalmente usando binários. Então o que posso fazer é te dar dicas de lógica. Na função de leitura, você provavelmente está passando algum parâmetro errado ou está se esquecendo de abrir e fechar o arquivo antes, ou passar o ponteiro para o início do arquivo, para ele poder ler todo o conteúdo. Na função de gravar, é provável que seja a mesma coisa. Sinto muito não poder ajudar mais; se fosse em C++, seus problemas estariam resolvidos, :(. Mas tenho certeza que logo logo algum expert em C aqui do fórum vem te ajudar. Qualquer dúvida referente à lógica fique a vontade para me perguntar e também para usar o código que te passei de base.

Att.,

Pedro

Muito obrigado, Pedro e não precisa se desculpar não,que isso!! =D Eu que agradeço e muito,vou continuar tentando programar e pode deixar que qualquer dúvida de lógica eu pergunto sim!

modode leiutura e escrita binária é assim "r+b"

É pra colocar "r+b" nas duas funções?!

#include <stdio.h>
#include <stdlib.h> //exit()
struct ag{
       char nome[100];
       char ende[100];
       char email[100];
       int tel;
       int cel;
       int comer;
       int id;
};
typedef struct ag Agenda; //para ficar melhor a compreensão
Agenda agenda;
FILE *arq;
int op;

Por que tem essa segunda biblioteca a #include <stdlib.h>,ela é pra fazer funcionar o exit?! e por que tem exit(1) e depois exit(2)?

Por que você colocou cada char e int em uma linha no struct ag, faz alguma diferença isso?

O que é esse typedef ?! do que ser?

Acho que seria um abuso isso,mas como meu professor não ensinou nada e eu gostaria muito de aprender e entender alguém poderia me explicar qual a função e o que realmente faz cada tag do fwrite e fread?! ( Tipo a a+,rb+,r+b ) as diferenças e tal,acho que se eu conseguisse entender isso conseguiria programar com mais facilidade, abraços! e muito obrigado por tudo rapaziada!

Por que tem que usar o gets(agenda.nome);//Use isso senão vai ocorrer seus erros descritos no tópico ?! e não o scanf?

"Um espaço antes auxilia o scanf a não pegar lixo em buffers" como assim lixo em buffers!? até hoje não entendi direito isso de buffer,você poderia me explicar?

(to abusando da boa vontade já né?! perguntando tudo.. uhauhauhahu é que eu queria realmente entender ;/)

Edited by Thiago Mendes
Link to comment
Share on other sites

  • 0

"Agora seu main() abre e não fecha "arquivos.bin" ai você quer abrir o mesmo arquivo em outra função? Isso vai causar perda de dados. se fosse você pensava um pouco na função menu(), transforme em main() e implemente mais alguma coisa para seu algoritmo funcionar. Ou use o retorna da função menu como int.

"

Perdão, não entendi o que você falou.. como assim abre e não fecha? Abrir o mesmo arquivo em outra função? Eu preciso colocar ele em ordem alfabética e conseguir deletar nomes dele,não sei como farei isso ao certo,mas por que causaria perda de dados? A função menu é só pra diminuir o tamanho do main(), ela é realmente só pra printar as opções,não entendi o problema dela?!

Edited by Thiago Mendes
Link to comment
Share on other sites

  • 0

O programa não tá dando certo com o gets, o que eu faço?! Na hora da chama ele chama pra entrar o nome e o telefone junto,tá com algum bugzinho,vou postar o código modificado:

#include <stdio.h>
#include <stdlib.h>  //exit()

struct ag{
       char nome[100],ende[100],email[100];
       int tel,cel,comer,id;
};
struct ag agenda;
//typedef struct ag Agenda; //para ficar melhor a compreensão
//Agenda agenda;
FILE *arq;
int op;
void menu(){
            printf("Bem vindo a agenda eletronica! Aperte:\n 1 - Inserir um nome \n 2 - Listagem de todos os nomes \n 3 - Consulta de dados (Por nome) \n 4 - Remocao de um nome \n 5 - Quantidade de nomes inicializados com cada letra do alfabeto \n 0 - Para fechar o programa\nOpcao: ");
            scanf("%d",&op);
            while(op < 0 && op > 5){
                                    printf("Erro! Opcao invalida,entre com um valor valido por favor:\n");
                                    scanf("%d",&op);
            }
}

void dados(){
     int op1,op2;
     printf("Entre com o nome:\n");
     //scanf(" %[^\n]s",&agenda.nome);
     gets(agenda.nome); //Use isso senão vai ocorrer seus erros descritos no tópico
     printf("Por favor entre com o telefone:\n");
     scanf(" %d",&agenda.tel);
     printf("Gostaria inserir mais dados? (0 - 1)\n");
     scanf(" %d",&op1); //Um espaço antes auxilia o scanf a não pegar lixo em buffers
     if(op1){
             printf("Gostaria de entrar com o Telefone Celular? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Tel. Celular: ");
                     scanf(" %d",&agenda.cel);
                     }
             printf("Gostaria de entrar com o Telefone Comercial? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Tel. Comercial: ");
                     scanf(" %d",&agenda.comer);
                     }
             printf("Gostaria de entrar com o Endereco? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("Endereco: ");
                     gets(agenda.ende);
                     }
             printf("Gostaria de entrar com o e-mail? (0 - 1)\n");
             scanf(" %d",&op2);
             if(op2){
                     printf("E-mail: ");
                     gets(agenda.email);
                     }
             }
}

void escrevearquivo(){
     arq = fopen("agenda.bin","ab"); // já inicia no final do arquivo
     if(arq == NULL){
                     printf("Erro ao abrir arquivo!\n");
                     exit(1); // termina o programa
                     }
     if(fwrite(&agenda, sizeof(agenda), 1, arq) != 1){ // teste para ver se escreve os dados no arquivo
                                                      printf("Erro ao escrever no arquivo!\n");
                                                      exit(2);
                                                      }
     fclose(arq);
}

void imprimiarquivo(){
     arq = fopen("agenda.bin","rb");
     if(arq == NULL){
                     printf("Erro ao abrir arquivo!\n");
                     exit(1);
                     }
     // enquanto for lido certo ou não seja o final do arquivo
     while(fread(&agenda, sizeof(agenda), 1, arq) == 1 && feof(arq)){
                                                                     printf("Nome: %s \nTelefone: %d \nCelular: %d \nComercial: %d \nEndereco:%s \nEmail:%s \n\n",agenda.nome, agenda.tel, agenda.cel, agenda.comer, agenda.ende, agenda.email);
                                                                     fread(&agenda, sizeof(agenda), 1, arq);
                                                                     }
     fclose(arq);
}


main(){
       int op3;
       if((arq = fopen("agenda.bin","a+")) == NULL ) // a+ para anexar informações,o wb+ estava apagando o conteúdo
               printf("Erro ao criar arquivo.");
       menu();
       while(op){
                if(op==1){
                          dados();
                          escrevearquivo();
                          system("cls");
                          menu();                                         
                          }
                if(op==2){
                          imprimiarquivo();
                          printf("1 - Voltar ao menu\n0 - Fechar agenda\nO que deseja? ");
                          scanf(" %d",&op3);
                          if(op3){
                                 system("cls");
                                 menu();
                                 }
                          else
                              op=0;
                          }
                /*if(op==5){
                          arq = fopen("agenda.bin","rb+");
                          fread(&agenda, sizeof(agenda), 1, arq);
                          if(agenda.nome)
                          while(!feof(arq)){
                                            printf("Nome: %s \nTelefone: %d \nCelular: %d \nComercial: %d \nEndereco:%s \nEmail:%s \n\n",agenda.nome, agenda.tel, agenda.cel, agenda.comer, agenda.ende, agenda.email);
                                            fread(&agenda, sizeof(agenda), 1, arq);
                                             }
                          fclose(arq);
               */ } 
       getch();
}

obs.: to trabalhando na opção 5 ainda,por isso tá em comentário

Link to comment
Share on other sites

  • 0

Se você pegar uma string com scanf ele lê uma string se você apertar space ou enter ele termina a leitura e deixa no buffer o resto da string, ou seja na próxima vez que você lê algo ele não vai esperar o usuario digitar e vai colocar o que der do buffer até quando esvazia-lo. Quando você lê um int e pressiona enter ele vai pro buffer e então o proximo scanf vai passar direto então coloco um espaço antes para ele ignorar algo que se pareça com isso(como um enter).

gets() é uma função que pega strings e espaços até que um enter seja pressionado;

por exemplo, digamos que o o usuario digitou Daniel Oliveira:

scanf("%s", nome); //Vai ler Daniel colocar na variavel nome e o resto vai pro buffer

gets(nome); //Vai ler Daniel Oliveira até encontar um enter e deixar o buffer limpo

Para os arquivos recomendo o livro de Luiz damas linguagem C.

Modo texto

"r" : permite leitura. não permite gravação. se o arquivo existir lê a partir do inicio. se não existir retorna NULL

"w" : não permite leitura. permite gravação. se o arquivo existir ele é recriado. se não existir ele é criado. grava a partir do inicio

"a" : não permite leitura. permite gravação. se o arquivo existir grava a partir do final(acrescenta). se não ele cria.

"r+" : permite gravação. permite leitura. se o arquivo existir permite alteração. se o arquivo não existir cria. le e grava a partir do inicio

"w+" : permite gravação. permite leitura. se o arquivo existir recria. se o arquivo não existir cria. grava e le a partir do inicio.

"a+" : permite gravação. permite leitura. se o arquivo existir grava e lê a partir do final. se não existir ele cria

para abrir em modo binário só acrescenta o b na frente. Terá a mesma opção que no modo texto. "rb", "wb", "ab", "r+b", "w+b", "a+b".

Perdão, não entendi o que você falou.. como assim abre e não fecha? Abrir o mesmo arquivo em outra função? Eu preciso colocar ele em ordem alfabética e conseguir deletar nomes dele,não sei como farei isso ao certo,mas por que causaria perda de dados? A função menu é só pra diminuir o tamanho do main(), ela é realmente só pra printar as opções,não entendi o problema dela?!

quando você trabalha com arquivos não podemos gravar direto no arquivo existe um camada de abstração no processo que chamamos de streams. Quando você abre um arquivo uma stream a ele é conectada. A stream pode ser modificada durante o programa, mas o arquivo só vai sofrer alteração se chamarmos explicitamente fclose(ponteiro_para_o_arquivo) ou quando o programa termina.

O que eu falo é mais ou menos assim, crie um texto no bloco de notas a abra ele novamente em outro bloco de notas. Escreva algo nele, salve. Agora vai no primeiro bloco de notas e salve também.O texto escrito vai ser apagado e ficará vazio. Isso acontece quando você abre um arquivo duas vezes ao mesmo tempo. Não é proibido, mas eu não recomendo.

sobre seu código agora, lembra do que eu disse sobre o scanf ele deixou aquele enter no buffer. Os programadores não recomendam, mas faça isso antes do gets().

fflush(stdin); //esvazia o buffer do teclado

Edited by Dan Oliveira
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...