Advertisement
MSavioti

Untitled

Jan 16th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. struct Games {
  8.     char nome[50];
  9.     double anoLancamento;
  10.     char plataforma[40];
  11.     char descricao[250];
  12. };
  13.  
  14. Games *buscaJogo(fstream *arquivo, char nome[]) // essa função busca um registro pelo nome dele
  15. {
  16.     arquivo->seekg(0);//posiciona o arquivo para o inicio para ler quantos registros existem salvos no arquivo
  17.    
  18.     int* n = NULL; // inteiro para guarda a quantidade de registros
  19.     n = new int; // alocando um inteiro para armazenar a quantidade de registros do arquivo
  20.     Games *aux = new Games; // registro auxiliar que vai armazenar o registro encontrado ou não
  21.    
  22.     arquivo->read((char *)n, sizeof(int)); // le do arquivo o inteiro e passa para a variavel n
  23.    
  24.     for (int i = 0; i < *n; i++) // laço percorrendo todos os registros no arquivo
  25.     {
  26.        arquivo->read((char *)aux, sizeof(Games)); // le um registro do arquivo e passa para a variavel aux
  27.  
  28.        if (strcmp(aux->nome, nome) == 0) // essa função retorna 0 se as duas cadeias de caracteres forem iguais
  29.        {
  30.            return aux; // retorna o jogo encontrado como resultado
  31.        }       
  32.     }  
  33.    
  34.     delete n; // desalocando o ponteiro que guardava a quantidade de registros
  35.     aux->anoLancamento = -1; // caso não tenha encotrado o jogo no arquivo, é atribuido -1 a variavel anoLancamento
  36.                             // para manter um controle e para dizer que não foi possível encontrar o jogo
  37.    
  38.     return aux; // retorna o registro com dados que não foi encontrado
  39. }
  40.  
  41. int encontraPosicaoParaInsercaoOrdenada(fstream *arquivo, int anoLancamento, int n) // essa função acha onde deve ser inserido o novo registro
  42. {
  43.     int* posicao = NULL; // variavel que guardara a posição
  44.     posicao = new int; // alocando um ponteiro para armazenar a posição correta de inserção
  45.     *posicao = 0; // atribuindo 0 para a variavel para percorrer de 0 até n
  46.  
  47.     Games *aux = new Games; // registro auxiliar para encontrar a posição de inserção
  48.  
  49.     while (*posicao < n) // laço de repetição para encontrar qual posição deve se inserir o novo registro até que a posição seja menor que n
  50.     {
  51.         arquivo->seekg(sizeof(int) + ( sizeof(Games)*(*posicao) )); // posiciona o arquivo de acordo com o valor da posição
  52.         arquivo->read((char *)aux, sizeof(Games)); // le um registro do arquivo e passa para a variavel aux
  53.  
  54.         if (aux->anoLancamento > anoLancamento) // comparação se o ano de lançamento do registro lido é maior que o novo a ser inserido
  55.         {
  56.             delete aux; // desalocando o ponteiro aux que armazenava os registro do arquivo
  57.            
  58.             return *posicao; // retorna o inteiro que armazena qual posição devera ser inserido
  59.             //break; // inutil ainda...
  60.         }
  61.         (*posicao)++; // incrementa a posição para controlar onde sera inserido
  62.     }
  63.    
  64.     delete aux; // desalocando o ponteiro aux que armazenava os registro do arquivo
  65.  
  66.     return *posicao; // retorno a ultima posição do arquivo já que o novo ano do registro não é menor que nenhum dado do arquivo'
  67. }
  68.  
  69. void imprimeJogos(fstream *arquivo) // função que imprime todos os dados do arquivos
  70. {
  71.     Games *aux = new Games; // registro auxiliar para controlar a impressão dos dados
  72.     arquivo->seekg(0); //posiciona o arquivo para o inicio para ler quantos registros existem salvos no arquivo
  73.     int *n = NULL; // inteiro para guardar a quantidade de registros, atribuindo NULL como forma de segurança
  74.     n = new int; // alocando um inteiro para n
  75.    
  76.     arquivo->read((char *)n, sizeof(int)); // le do arquivo o inteiro e passa para a variavel n
  77.    
  78.     cout << "===========================================================================" << endl;
  79.     cout << "=================     Existem " << *n << " Jogos Cadastrados      ====================" << endl << endl;  
  80.  
  81.     for (int i = 0; i < *n; i++) // laço de repetição percorrendo todos os registros do arquivo
  82.     {
  83.         arquivo->read((char *)aux, sizeof(Games)); // le um registro do arquivo e passa para a variavel aux
  84.         cout << "===========================================================================" << endl;
  85.         cout << "==== Nome = " << aux->nome << endl;
  86.         cout << "==== Ano de Lançamento = " << aux->anoLancamento << endl;
  87.         cout << "==== Plataforma do Jogo = " << aux->plataforma << endl;
  88.         cout << "==== Descrição do Jogo = " << aux->descricao << endl;
  89.         cout << "===========================================================================" << endl;
  90.         // OBS.: não preciso posicionar mais o arquivo, pois em C++, quando se lê algo do arquivo,
  91.         // o arquivo pula para próxima posição disponivel, sendo assim não precisa posicionar ele de novo
  92.     }
  93.    
  94.     delete n; // desalocando o ponteiro que guardava a quantidade de registros
  95.     delete aux; // desalocando o ponteiro aux que armazenava os registro do arquivo
  96.    
  97.     cout << endl;
  98. }
  99.  
  100. void insereNoArquivo(Games *novoJogo, fstream *arquivo, int posicao, int &n) // essa função insere o novo registro já ordenado no arquivo
  101. {
  102.     arquivo->seekp(0); //posiciona o arquivo para o inicio para ler quantos registros existem salvos no arquivo
  103.     n++; // incrementa o n antecipadamente para atualizar a quantidade de registro no arquivo
  104.  
  105.     arquivo->write((char *)&n, sizeof(int)); // escreve o valor da variavel n no arquivo, escreve em cima da variavel n que ja estava antes no arquivo
  106.     n--; // decrementa n para ter controle de quantos registros já estavam cadastrados no arquivo
  107.  
  108.     Games *aux = new Games; // registro auxiliar para manipular os regitros já inscrito no arquivo
  109.  
  110.     for (int i = n-1; i >= posicao; i--) // laço de repetição començando do tamanho menos um ate a posição que deve ser inserido o novo registro
  111.     {
  112.         arquivo->seekg(sizeof(int) + sizeof(Games)*i); // posiciona o arquivo com a determinada posição que deve ser lida
  113.         arquivo->read((char *)aux, sizeof(Games)); // le o registro posicionado e passa para o registro aux
  114.        
  115.         arquivo->seekp(sizeof(int) + sizeof(Games)*(i+1)); // posiciona o arquivo para próxima posição que tinha sido posicionado antes
  116.         arquivo->write((char *)aux, sizeof(Games)); // escreve o registro auxiliar lido anteriormente e escreve ele no arquivo como sucessor do que foi lido
  117.        
  118.         // essas quatros linhas faz com que troque todos os registros de posição, porem ele troca todos, passando eles para frente, pois quando for adicionar
  119.         // o novo registro no arquivo, vai adicionar ele em uma posição "vazia", já que trocou todos de lugar
  120.         // desenhando e explicando pessoalmente é melhor
  121.        
  122.         arquivo->flush(); // essa funçao meio que atualiza o arquivo
  123.     }
  124.  
  125.     arquivo->seekp(sizeof(int) + sizeof(Games)*posicao); // posiciona o arquivo na posição que deve ser inserida
  126.     arquivo->write((char *)novoJogo, sizeof(Games)); // insere o novo registro no arquivo, com a posição correta
  127.     arquivo->flush(); // essa funçao meio que atualiza o arquivo
  128.  
  129.     n++; // atualiza o valor de n para utilizar futuramente
  130.    
  131.     delete aux; // desalocando o ponteiro aux que armazenava os registro do arquivo
  132. }
  133.  
  134. bool atualizaJogo(fstream *arquivo, char nome[])
  135. {
  136.     arquivo->seekg(0); //posiciona o arquivo para o inicio para ler quantos registros existem salvos no arquivo
  137.    
  138.     int *n = NULL; // inteiro para guardar a quantidade de registros, atribuindo NULL como forma de segurança
  139.     n = new int; // alocando um inteiro para n
  140.    
  141.     bool* ok = NULL; // bool para guardar o estado da quantidade
  142.     ok = new bool; // alocando um boleano para ok
  143.     *ok = false; // atribuindo false como forma de manter controle da operação
  144.    
  145.     arquivo->read((char *)n, sizeof(int)); // le do arquivo o inteiro e passa para a variavel n
  146.    
  147.     Games *aux = new Games; // registro auxiliar para manipular dados salvos
  148.    
  149.     for (int i = 0; i < *n && *ok == false; i++) // laço percorrendo todos os registros no arquivo
  150.     {
  151.         arquivo->read((char *)aux, sizeof(Games)); // le um registro do arquivo e passa para a variavel aux
  152.        
  153.         if (strcmp(aux->nome, nome) == 0) // essa função retorna 0 se as duas cadeias de caracteres forem iguais
  154.         {          
  155.             cout << "===========================================================================" << endl;
  156.             cout << "========== Atualize os dados do jogo -> " << aux->nome << endl;
  157.  
  158.             cout << "========== Nome Do Jogo -> ";
  159.             cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  160.             cin.get(aux->nome, 50); // essa função pega a linha inteira digitada pelo console
  161.  
  162.             cout << "========== Ano de Lançamento do Jogo -> ";
  163.             cin >> aux->anoLancamento;
  164.  
  165.             cout << "========== Plataforma do Jogo -> ";               
  166.             cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  167.             cin.get(aux->plataforma, 40); // essa função pega a linha inteira digitada pelo console
  168.  
  169.             cout << "========== Descrição do Jogo -> ";  
  170.             cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  171.             cin.get(aux->descricao, 250); // essa função pega a linha inteira digitada pelo console
  172.  
  173.             arquivo->seekp(sizeof(int) + sizeof(Games)*i); // posiciona o arquivo na posição que deve ser inserida
  174.             arquivo->write((char *)aux, sizeof(Games)); // insere o novo registro no arquivo, com a posição correta
  175.             arquivo->flush(); // essa funçao meio que atualiza o arquivo depois de uma alteração
  176.  
  177.             *ok = true; // atribuindo true como forma de informar que foi possível alterar o dado
  178.             cout << "===========================================================================" << endl << endl;
  179.        }             
  180.     }
  181.    
  182.     delete n; // desalocando o ponteiro que guardava a quantidade de registros
  183.     delete aux; // desalocando o ponteiro aux que armazenava os registro do arquivo
  184.    
  185.     if (*ok == true) // conferindo se foi possível editar o dado
  186.     {
  187.         return true;
  188.     }
  189.     else // caso não foi possível entrará aqui
  190.     {
  191.         return false;
  192.     }  
  193. }
  194.  
  195. int main()
  196. {
  197.     int* n = NULL; // inteiro para guarda a quantidade de registros
  198.     n = new int; // alocando um inteiro para armazenar a quantidade de registros do arquivo
  199.     *n = 0; // atribui 0 para escrever no arquivo, caso não exista um arquivo
  200.  
  201.     fstream arquivo("Games.bin", ios::binary| ios::in | ios::out ); // abre o arquivo já "existente" para leitura e escrita
  202.  
  203.     if (arquivo.good() == false) // confere se o arquivo está ilegivel
  204.     {
  205.          arquivo.open("Games.bin", ios::binary|  ios::in | ios::out |ios::trunc); // caso o arquivo não esteja legivel, é aberto um novo arquivo, com o mesmo
  206.                                                                                   // nome, porem descartando tudo que existe no arquivo
  207.          arquivo.write((char *) n,sizeof(int)); // escreve no arquivo o valor de n
  208.     }
  209.     else
  210.     {
  211.         arquivo.read((char*)n, sizeof(int)); // le do arquivo o valor de n e escreve em n
  212.     }
  213.    
  214.     int* posicao = NULL; // // variaveis que aramazenara a posição correta de inserção
  215.     posicao = new int; // aloca um inteiro para guardar a posição de inserção
  216.    
  217.     int* operacao = NULL; // variaveis que ira ajudar no controle das operações do arquivo
  218.     operacao = new int; // aloca um inteiro para manipular a operação desejada
  219.    
  220.     do
  221.     {
  222.         if (arquivo.good() == false) // caso o arquivo esteja com algum problema durante a manipulção
  223.         {
  224.             cout << "=========================== Erro no Arquivo ===============================" << endl;
  225.         }
  226.        
  227.         cout << "===========================================================================" << endl;
  228.         cout << "========== Digite uma das opções para realizar uma operação     ===========" << endl;
  229.         cout << "========== 1 - Para Inserir novo Jogo no arquivo                ===========" << endl;
  230.         cout << "========== 2 - Para Atualizar um Jogo no arquivo                ===========" << endl;
  231.         cout << "========== 3 - Para Buscar um Jogo no arquivo                   ===========" << endl;
  232.         cout << "========== 4 - Para Listar todos os Jogos do arquivo            ===========" << endl;
  233.         cout << "========== 0 - Para Sair                                        ===========" << endl;
  234.         cout << "===========================================================================" << endl;
  235.         cout << "========== ";
  236.        
  237.         cin >> *operacao;
  238.        
  239.         cout << endl;
  240.  
  241.         switch (*operacao)
  242.         {
  243.             case 1:
  244.             {
  245.                 Games *jogo = new Games; // variavel que servira para adicionar um novo registro no arquivo
  246.                
  247.                 cout << "===========================================================================" << endl;
  248.                 cout << "==========             Digite os campos necessários              ==========" << endl;
  249.                 cout << "===========================================================================" << endl;
  250.  
  251.                 cout << "========== Nome Do Jogo -> ";
  252.                
  253.                 cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  254.                 cin.get(jogo->nome, 50); // essa função pega a linha inteira digitada pelo console
  255.                
  256.                 cout << "========== Ano de Lançamento do Jogo -> ";
  257.                 cin >> jogo->anoLancamento;
  258.  
  259.                 cout << "========== Plataforma do Jogo -> ";               
  260.                
  261.                 cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  262.                 cin.get(jogo->plataforma, 40); // essa função pega a linha inteira digitada pelo console
  263.                
  264.                 cout << "========== Descrição do Jogo -> ";
  265.                
  266.                 cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  267.                 cin.get(jogo->descricao, 250); // essa função pega a linha inteira digitada pelo console
  268.  
  269.                 *posicao = encontraPosicaoParaInsercaoOrdenada(&arquivo, jogo->anoLancamento, *n); // armazenara o valor da posição de inserção do novo dado
  270.                 insereNoArquivo(jogo, &arquivo, *posicao, *n); // chama a função e insere o novo registro
  271.                
  272.                 cout << "===========================================================================" << endl;
  273.                 cout << "====================     Jogo Cadastrado Com Sucesso!     =================" << endl;
  274.                 cout << "===========================================================================" << endl << endl;
  275.                
  276.                 delete posicao; // desalocando o inteiro que armazenava a posição de inserção
  277.                 delete[] jogo; // desalocando o registro que foi ultilizado para inserir no arquivo
  278.                
  279.                 break;
  280.             }
  281.             case 2:
  282.             {
  283.                 char* nomeJogoEditar = new char[50]; // alocando um vetor de char para guardar o nome do jogo que vai ser editado              
  284.                
  285.                 cout << "===========================================================================" << endl;
  286.                 cout << "========== Digite o nome do Jogo a ser Atualizado no Arquivo    ===========" << endl;
  287.                 cout << "===========================================================================" << endl;
  288.                
  289.                 cout << "========== ";
  290.                
  291.                 cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  292.                 cin.get(nomeJogoEditar, 50); // essa função pega a linha inteira digitada pelo console
  293.                
  294.                 cout << "===========================================================================" << endl << endl;
  295.                
  296.                 bool* ok = NULL; // bool para guardar o estado da quantidade
  297.                 ok = new bool; // alocando um boleano para ok
  298.                 *ok = false; // atribuindo false como forma de manter controle da operação
  299.                
  300.                 *ok = atualizaJogo(&arquivo, nomeJogoEditar); // armazenando o valor retornado pela função
  301.                
  302.                 if (*ok == true)
  303.                 {
  304.                     cout << "===========================================================================" << endl;
  305.                     cout << "====================  Dados atualizados com sucesso!  =====================" << endl;     
  306.                     cout << "===========================================================================" << endl << endl;     
  307.                 }
  308.                 else
  309.                 {
  310.                     cout << "===========================================================================" << endl;
  311.                     cout << "=== Não foi possível atualizar os dados desse jogo, tente novamente...  ===" << endl;
  312.                     cout << "===========================================================================" << endl << endl;     
  313.                 }
  314.                
  315.                 delete ok; // deletando o ponteiro que guardava o estado da operação
  316.                 delete[] nomeJogoEditar; // deletando o vetor de char que guardava o nome do jogo a ser editado
  317.                
  318.                 break;
  319.             }
  320.             case 3:
  321.             {
  322.                 Games *jogoEncontrado = NULL; // ponteiro que guarda o registro que vai ser procurado
  323.                 char* nomeJogo = new char[50]; // alocando um vetor de char para guardar o nome do jogo a ser pesquisado
  324.                
  325.                 cout << "===========================================================================" << endl;             
  326.                 cout << "========== Digite o nome do Jogo a ser Buscado no Arquivo       ===========" << endl;
  327.                 cout << "===========================================================================" << endl;
  328.                 cout << "========== ";
  329.                
  330.                 cin.ignore(); // essa função "ignora" caracteres que já estão no console, serve como forma de limpar o teclado
  331.                 cin.get(nomeJogo, 50); // essa função pega a linha inteira digitada pelo console
  332.                
  333.                 cout << "===========================================================================" << endl << endl;
  334.                
  335.                 jogoEncontrado = buscaJogo(&arquivo, nomeJogo); // armazenara o valor que foi encontrado pela função
  336.                
  337.                 if (jogoEncontrado->anoLancamento == -1) // um controle, caso não tenha encontrado o jogo no arquivo
  338.                 {
  339.                     cout << "===========================================================================" << endl;
  340.                     cout << "========== Nenhum jogo com esse nome foi encontrado...          ===========" << endl;
  341.                     cout << "===========================================================================" << endl << endl;
  342.                 } else {
  343.                     cout << "===========================================================================" << endl;
  344.                     cout << "======================      Jogo encontrado       =========================" << endl;
  345.                     cout << "===========================================================================" << endl;
  346.                     cout << "==== Nome = " << jogoEncontrado->nome << endl;
  347.                     cout << "==== Ano de Lançamento = " << jogoEncontrado->anoLancamento << endl;
  348.                     cout << "==== Plataforma do Jogo = " << jogoEncontrado->plataforma << endl;
  349.                     cout << "==== Descrição do Jogo = " << jogoEncontrado->descricao << endl;
  350.                     cout << "===========================================================================" << endl << endl;
  351.                 }
  352.                
  353.                 delete[] nomeJogo; // desalocando o vetor de char que armazenava o nome do jogo
  354.                 delete[] jogoEncontrado; // desalocando o registro que armazenou o resultado da busca
  355.  
  356.                 break;
  357.             }
  358.             case 4:
  359.             {
  360.                 imprimeJogos(&arquivo); // imprimindo todos os jogos do arquivo
  361.                 break;
  362.             }
  363.            
  364.         }
  365.  
  366.     } while (*operacao != 0);
  367.  
  368.     cout << "===========================================================================" << endl;
  369.     cout << "==========================       Até Logo...      =========================" << endl;
  370.     cout << "===========================================================================" << endl;
  371.  
  372.     delete n; // desalocando o inteiro que armazenava a quantidade de registros no arquivo
  373.     delete operacao; // desalocando o inteiro que manipulava as operações
  374.  
  375.     arquivo.close(); // fecha o arquivo de maneira segura
  376.    
  377.     return 0;
  378. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement