Advertisement
roneygomes

Importação da Agenda

Oct 13th, 2011
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.11 KB | None | 0 0
  1.  
  2. void importar(nodo **raiz)
  3. {
  4.     FILE    *agenda;
  5.     char    *aux;   /*  Ponteiro auxiliar usado por getline. */
  6.     /*
  7.      * Especifica o tamanho (em bytes) do bloco
  8.      * de memória que receberá a linha lida por
  9.      * getline.
  10.      */
  11.     int     nbytes;
  12.  
  13.     nbytes  = sizeof(char);
  14.     agenda  = fopen("agenda.txt", "r");
  15.  
  16.     if(agenda == NULL) {
  17.         system("clear");
  18.         __fpurge(stdin);
  19.  
  20.         printf("Erro ao abrir o arquivo.\n");
  21.         printf("Pressione <ENTER> pra retornar ao menu principal.");
  22.         fgetc(stdin);
  23.     } else {
  24.         /*-----------------------------------------------------------------------------
  25.          *  Enquanto não encontrar o fim do arquivo lê cada uma de suas linhas,
  26.          *  armazenando a informação lida na variável correspondente.
  27.          *
  28.          *  Foi utilizada para a leitura de cada linha apenas a função getline, já que
  29.          *  ela é a função padrão para a leitura de arquivos. As demais funções
  30.          *  não possuem um bom tratamento para a leitura de espaços e quebras de linha.
  31.          *
  32.          *  Como getline armazena a linha lida em uma string, foi utilizado um ponteiro
  33.          *  de caracteres auxiliar (char *aux) para a leitura dos dados que não são
  34.          *  strings (sexo, idade, telefone e ira). A conversão para o tipo apropriado é
  35.          *  feita logo após a leitura.
  36.          *-----------------------------------------------------------------------------*/
  37.        while(1) {
  38.             nodo            *novoNodo;
  39.  
  40.             novoNodo        = (nodo *)malloc(sizeof(nodo));
  41.             novoNodo->nome  = (char *)malloc(250);
  42.             novoNodo->email = (char *)malloc(250);
  43.  
  44.             getline(&(novoNodo->nome), &nbytes, agenda);
  45.             getline(&(novoNodo->email), &nbytes, agenda);
  46.  
  47.             getline(&aux, &nbytes, agenda);
  48.             novoNodo->sexo = aux[0];
  49.  
  50.             getline(&aux, &nbytes, agenda);
  51.             novoNodo->idade = atoi(aux);
  52.  
  53.             getline(&aux, &nbytes, agenda);
  54.             novoNodo->telefone = atoi(aux);
  55.  
  56.             getline(&aux, &nbytes, agenda);
  57.             novoNodo->ira = atof(aux);
  58.  
  59.             /*-----------------------------------------------------------------------------
  60.              *  Você pode considerar sem sentido o uso da estrutura condicional abaixo,
  61.              *  já que poderia ser utilizado apenas um while(!feof(agenda)). Você também
  62.              *  pode considerar "deselegante" o uso de break, o que é uma tolice.
  63.              *
  64.              *  Acontece que feof(agenda) retorna verdadeiro apenas após uma tentativa
  65.              *  de ler o arquivo tiver sido feita e o fim do arquivo for encontrado.
  66.              *  Portanto, o laço vai iterar sempre uma vez a mais que o desejado, poluindo
  67.              *  a agenda com dados nulos, lixo.
  68.              *
  69.              *  Também poderia ser utilizado
  70.              *  while(getline(&(novoNodo->nome), &nbytes, agenda)) mas isso requer a
  71.              *  declaração do ponteiro novoNodo antes do laço, o que causaria falha de
  72.              *  segmentação. Sem contar que o código ficaria ilegível, ganhando uma
  73.              *  quantidade desnecessária de linhas.
  74.              *
  75.              *  Não observo solução mais simples que a abaixo.
  76.              *-----------------------------------------------------------------------------*/
  77.             if(feof(agenda))
  78.                 break;
  79.  
  80.             /* Insere os dados lidos na lista, como na função inserir. */
  81.             if(*raiz == NULL)
  82.                 *raiz = novoNodo;
  83.             else {
  84.                 nodo *aux = *raiz;
  85.  
  86.                 while(aux->proximo != NULL)
  87.                     aux = aux->proximo;
  88.  
  89.                 aux->proximo        = novoNodo;
  90.                 novoNodo->anterior  = aux;
  91.             }
  92.  
  93.             ordenar(raiz);
  94.         }
  95.  
  96.         fclose(agenda);
  97.  
  98.         system("clear");
  99.         __fpurge(stdin);
  100.  
  101.         printf("Importação feita com sucesso.\n");
  102.         printf("Pressione <ENTER> pra retornar ao menu principal.");
  103.         fgetc(stdin);
  104.    }
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement