Advertisement
wagner-cipriano

Array of Structs with and persistence in text file

Jun 6th, 2023 (edited)
846
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.08 KB | Science | 0 0
  1. /*
  2. Structs com vetor e persistencia em memória secundária
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <locale.h>
  8. #define n 10
  9. const char pathFile[50] = "db_crud.log";
  10. int is_ptbr = 1;
  11.  
  12. //Structs: Declaração das estruturas de dados heterogêneas (novos tipos de dados)
  13. typedef struct { // Cria uma STRUCT para armazenar datas
  14.     int dia, mes, ano;
  15. } Data;   // Define o nome do novo tipo criado
  16.  
  17. typedef struct {  // Cria uma STRUCT para armazenar vendas
  18.    int qde;
  19.    float preco, total;
  20.    Data data_venda;
  21. } Venda;  // Define o nome do novo tipo criado
  22.  
  23. //Prototipos
  24. Venda novaVenda();
  25. void listaTotalVendas(Venda v[], int qt_reg);
  26. void ReadFromFile(Venda v[], int *cnt);
  27. void SaveToFile(Venda v[], int qt_reg);
  28. int getLanguagePtBr();
  29.  
  30. int main() {
  31.   is_ptbr = getLanguagePtBr();
  32.   Venda vet_vendas[n];
  33.   int opc=1;
  34.   int cnt=0;
  35.  
  36.   //Ler os dados do arquivo
  37.   ReadFromFile(vet_vendas, &cnt);
  38.  
  39.   while(opc > 0) {
  40.     //Limpa a tela
  41.     #ifdef __linux__
  42.       system("clear");
  43.     #else
  44.       system("@cls||clear");
  45.     #endif
  46.  
  47.     //Menu
  48.     printf("\nEscolha a opção no menu:  \n  Inserir nova venda:  1  \n  Imprimir relatório:  2  \n  Sair:                0  \n  Sua opção:           ");
  49.     scanf("%d", &opc);
  50.     if(opc == 0)
  51.         printf("  Bye!\n");
  52.     else if(opc == 1) {
  53.         if(cnt<n) {
  54.           vet_vendas[cnt] = novaVenda();
  55.           cnt++;
  56.         } else {
  57.             printf("\nImpossível inserir novo.\n  Número máximo de registros já atingido (%d).\n", n);
  58.             system("pause");
  59.         }
  60.     }
  61.     else if(opc == 2) {
  62.         listaTotalVendas(vet_vendas, cnt);
  63.         system("pause");
  64.     }
  65.     else {
  66.         printf("  Opção Inválida!\n");
  67.         sleep(3);
  68.     }
  69.   }
  70.  
  71.   //Salva os dados no arquivo antes de fechar o programa
  72.   SaveToFile(vet_vendas, cnt);
  73.   return 0;
  74. }
  75.  
  76. Venda novaVenda() {
  77.    char help_txt[30] = "";
  78.    if(is_ptbr)
  79.         strncpy(help_txt, "(Padrão ptBR: Ex: 9,89)", 30);
  80.    Venda v;
  81.    printf("\nNova Venda:");
  82.    printf("\n  Insira dia mes e ano da venda, separando por espaço: ");
  83.    scanf("%d %d %d", &v.data_venda.dia, &v.data_venda.mes, &v.data_venda.ano);
  84.    printf("  Insira a qtde vendida:                               ");
  85.    scanf("%d", &v.qde);
  86.    printf("  Insira o preço %s:              ", help_txt);
  87.    scanf("%f", &v.preco);
  88.    v.total = v.qde * v.preco;
  89.    return v;
  90. }
  91.  
  92. void listaTotalVendas(Venda v[], int qt_reg) {
  93.   int qt_venda=0;
  94.   float tot=0;
  95.   for(int i=0; i<qt_reg; i++) {
  96.     qt_venda += v[i].qde;
  97.     tot += v[i].total;
  98.   }
  99.   printf("\n  Relatório Totais de vendas:");
  100.   printf("\n    Quantidade de vendas já realizadas:     %d", qt_reg);
  101.   printf("\n    Quantidade total de unidades vendidas:  %d", qt_venda);
  102.   printf("\n    Valor total faturamento:                R$ %.2f\n\n", tot);
  103. }
  104.  
  105. void ReadFromFile(Venda v[], int *cnt) {
  106.   // dia;mes;ano;qde;preco,total
  107.   FILE *fp;
  108.   char *line = NULL;
  109.   size_t len = 0;
  110.   ssize_t read;
  111.   int dia, mes, ano, qtde;
  112.   float valor, total;
  113.   fp = fopen (pathFile, "r");
  114.   if (fp == NULL)
  115.     return;
  116.  
  117.   while ((read = getline(&line, &len, fp)) != -1) {
  118.     Venda venda;
  119.     sscanf(line, "%d;%d;%d;%d;%f;", &venda.data_venda.dia, &venda.data_venda.mes, &venda.data_venda.ano, &venda.qde, &venda.preco);
  120.     //printf("%d %d %d %d %.2f %.2f\n", venda.data_venda.dia, venda.data_venda.mes, venda.data_venda.ano, venda.qde, venda.preco, venda.total);
  121.     venda.total = venda.qde * venda.preco;
  122.  
  123.     v[(*cnt)++] = venda;
  124.   }
  125.   int resp_close = fclose(fp);
  126.   printf("resp_close: %d", resp_close);
  127. }
  128.  
  129. void SaveToFile(Venda v[], int qt_reg) {
  130.   char* buffer = NULL;
  131.   size_t bufferSize = 0;
  132.   FILE *fp;
  133.   fp = fopen (pathFile, "w");
  134.   for(int i=0; i<qt_reg; i++) {
  135.     fprintf(fp, "%d;%d;%d;%d;%.2f;%.2f;\n", v[i].data_venda.dia, v[i].data_venda.mes, v[i].data_venda.ano, v[i].qde, v[i].preco, v[i].total);
  136.   }
  137.   fclose(fp);
  138. }
  139.  
  140. int getLanguagePtBr() {
  141.   char *loc_str = setlocale(LC_ALL, "");
  142.   char * ptr = strpbrk(loc_str, "Portuguese");
  143.   return !strcmp(loc_str, ptr);
  144. }
  145.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement