Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.19 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define IDSIZE 5  /// Tamanho das strings que serão salvas.
  6.  
  7. /// Struct para compor a lista encadeada:
  8. typedef struct registro
  9. {
  10.   /// 'id' guarda a string da instancia.
  11.   char id[IDSIZE];
  12.   /// Referência para o próximo elemento da lista:
  13.   struct registro *prox;
  14. }REGISTRO;
  15.  
  16. // Ponteiro para o arquivo com as strings:
  17. FILE *chFile;
  18.  
  19. int main()
  20. {
  21.   /// String auxiliar, para a qual serão lidas as strings do arquivo primeiramente.
  22.   char strAuxRead[IDSIZE]={0};
  23.  
  24.   /// Ponteiro para o início da lista:
  25.   REGISTRO *chIni = (REGISTRO*)malloc(sizeof(REGISTRO));
  26.  
  27.   /// Ponteiro auxiliar, para montar a lista:
  28.   REGISTRO *chPercorre = chIni;
  29.  
  30.   /// Este é o ponteiro que muda estranhamente de valor.
  31.   /// Neste código de teste eu nem uso ele para nada, apenas
  32.   ///  nos printfs abaixo para mostrar o problema.
  33.   REGISTRO *cadIni = (REGISTRO*)malloc(sizeof(REGISTRO));
  34.  
  35.  
  36.   chFile = fopen("keys.txt","r");
  37.  
  38.   /// Primeiro eu leio a primeira string do arquivo para o primeiro
  39.   ///  elemento da lista, antes de entrar no loop do while.
  40.   fscanf(chFile, "%s", chIni->id);
  41.  
  42.  
  43.   while(!feof(chFile)){
  44.    /// Leio uma string de cada vez para 'strAuxRead',
  45.    ///  para testar seu comprimento e daí sim criar ou não
  46.    ///  um novo elemento para a lista.
  47.    /// Aqui uso os printfs para mostrar que o ponteiro
  48.    ///  passa a apontar para outra área de memória, após
  49.    ///  algumas iterações.
  50.    printf("\n - %p -\n", cadIni);
  51.    fscanf(chFile, "%s", strAuxRead);
  52.    printf("\n - %p -\n", cadIni);
  53.  
  54.    /// Se o comprimento da string lida for igual a IDSIZE, então
  55.    ///  esta string é adicionada à lista.
  56.    if(strlen(strAuxRead) == IDSIZE){
  57.     chPercorre->prox = (REGISTRO*)malloc(sizeof(REGISTRO));
  58.     strcpy(chPercorre->prox->id, strAuxRead);
  59.     chPercorre = chPercorre->prox;
  60.    }
  61.   }
  62.  
  63.   /// O último elemento aponta para NULL.
  64.   chPercorre->prox = NULL;
  65.  
  66.   /// Teste só para ver se as strings salvas possúem comprimento IDSIZE.
  67.   /*
  68.   chPercorre = chIni;
  69.   while(chPercorre)
  70.   {
  71.    printf("%s\n", chPercorre->id);
  72.    chPercorre = chPercorre->prox;
  73.   }
  74.   */
  75.  
  76.   fclose(chFile);
  77.   return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement