Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void importar(nodo **raiz)
- {
- FILE *agenda;
- char *aux; /* Ponteiro auxiliar usado por getline. */
- /*
- * Especifica o tamanho (em bytes) do bloco
- * de memória que receberá a linha lida por
- * getline.
- */
- int nbytes;
- nbytes = sizeof(char);
- agenda = fopen("agenda.txt", "r");
- if(agenda == NULL) {
- system("clear");
- __fpurge(stdin);
- printf("Erro ao abrir o arquivo.\n");
- printf("Pressione <ENTER> pra retornar ao menu principal.");
- fgetc(stdin);
- } else {
- /*-----------------------------------------------------------------------------
- * Enquanto não encontrar o fim do arquivo lê cada uma de suas linhas,
- * armazenando a informação lida na variável correspondente.
- *
- * Foi utilizada para a leitura de cada linha apenas a função getline, já que
- * ela é a função padrão para a leitura de arquivos. As demais funções
- * não possuem um bom tratamento para a leitura de espaços e quebras de linha.
- *
- * Como getline armazena a linha lida em uma string, foi utilizado um ponteiro
- * de caracteres auxiliar (char *aux) para a leitura dos dados que não são
- * strings (sexo, idade, telefone e ira). A conversão para o tipo apropriado é
- * feita logo após a leitura.
- *-----------------------------------------------------------------------------*/
- while(1) {
- nodo *novoNodo;
- novoNodo = (nodo *)malloc(sizeof(nodo));
- novoNodo->nome = (char *)malloc(250);
- novoNodo->email = (char *)malloc(250);
- getline(&(novoNodo->nome), &nbytes, agenda);
- getline(&(novoNodo->email), &nbytes, agenda);
- getline(&aux, &nbytes, agenda);
- novoNodo->sexo = aux[0];
- getline(&aux, &nbytes, agenda);
- novoNodo->idade = atoi(aux);
- getline(&aux, &nbytes, agenda);
- novoNodo->telefone = atoi(aux);
- getline(&aux, &nbytes, agenda);
- novoNodo->ira = atof(aux);
- /*-----------------------------------------------------------------------------
- * Você pode considerar sem sentido o uso da estrutura condicional abaixo,
- * já que poderia ser utilizado apenas um while(!feof(agenda)). Você também
- * pode considerar "deselegante" o uso de break, o que é uma tolice.
- *
- * Acontece que feof(agenda) retorna verdadeiro apenas após uma tentativa
- * de ler o arquivo tiver sido feita e o fim do arquivo for encontrado.
- * Portanto, o laço vai iterar sempre uma vez a mais que o desejado, poluindo
- * a agenda com dados nulos, lixo.
- *
- * Também poderia ser utilizado
- * while(getline(&(novoNodo->nome), &nbytes, agenda)) mas isso requer a
- * declaração do ponteiro novoNodo antes do laço, o que causaria falha de
- * segmentação. Sem contar que o código ficaria ilegível, ganhando uma
- * quantidade desnecessária de linhas.
- *
- * Não observo solução mais simples que a abaixo.
- *-----------------------------------------------------------------------------*/
- if(feof(agenda))
- break;
- /* Insere os dados lidos na lista, como na função inserir. */
- if(*raiz == NULL)
- *raiz = novoNodo;
- else {
- nodo *aux = *raiz;
- while(aux->proximo != NULL)
- aux = aux->proximo;
- aux->proximo = novoNodo;
- novoNodo->anterior = aux;
- }
- ordenar(raiz);
- }
- fclose(agenda);
- system("clear");
- __fpurge(stdin);
- printf("Importação feita com sucesso.\n");
- printf("Pressione <ENTER> pra retornar ao menu principal.");
- fgetc(stdin);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement