imple.c
//loga os dados do arquivo para o struct

loga os dados do arquivo para o struct
loga os dados do arquivo para o struct
void load(struct livros *inv, int *cont){
  FILE *fp;
  fp = fopen("db.txt", "a+");
  if(fp != NULL){
    void tokenize(char* entry, char response[7][80]){
        int i = 0;
        char *token;
        token = strtok(entry, "|");
        while(token != NULL ) {
          strcpy(response[i], token);
          token = strtok(NULL, "|");
          i++;
        }
    }
    int i = 0, j;
    char a[30][200];
    rewind(fp);
    while(feof(fp) == 0){
      fscanf(fp,"%[^\n]", a[i]);
      if(feof(fp) == 0){
        fseek( fp, sizeof(char), SEEK_CUR);
      }
      i++;
    }
    for(j = 0; j < i-1; j++){
      char response[7][80];
      tokenize(a[j], response);
      int pos = strtol(response[0], NULL, 10);
      int pub = strtol(response[4], NULL, 10);
      int exp = strtol(response[6], NULL, 10);
      inv[j].id = pos;
      inv[j].publicacao = pub;
      inv[j].exemplares = exp;
      strcpy(inv[j].titulo, response[1]);
      strcpy(inv[j].autor, response[2]);
      strcpy(inv[j].genero, response[3]);
      strcpy(inv[j].editora, response[5]);
    }
    FILE *ident;
    ident = fopen("contador.txt", "r");
    if(ident == NULL){
      fseek(fp, 0, SEEK_END);
      if(ftell(fp) != 0){
        *cont = inv[contar(inv)].id+1;
      }
    } else {
      char num[2];
      fscanf(ident,"%[^\n]", num);
      int leitura = strtol(num, NULL, 10);
      *cont = leitura;
      fclose(ident);
    }
    fclose(fp);
  } else {
    printf("Não foi possível abrir a base de dados.\n");
  }
}
void load ( struct livros * inv , int * cont ) { FILE * fp ; fp = fopen ( " " , " " ) ; if ( fp != NULL ) { void tokenize ( char * entry , char response [ 7 ] [ 80 ] ) { int i = 0 ; char * token ; token = strtok ( entry , " " ) ; while ( token != NULL ) { strcpy ( response [ i ] , token ) ; token = strtok ( NULL , " " ) ; i ++ ; } } int i = 0 , j ; char a [ 30 ] [ 200 ] ; rewind ( fp ) ; while ( feof ( fp ) == 0 ) { fscanf ( fp , " \n " , a [ i ] ) ; if ( feof ( fp ) == 0 ) { fseek ( fp , sizeof ( char ) , SEEK_CUR ) ; } i ++ ; } for ( j = 0 ; j < i - 1 ; j ++ ) { char response [ 7 ] [ 80 ] ; tokenize ( a [ j ] , response ) ; int pos = strtol ( response [ 0 ] , NULL , 10 ) ; int pub = strtol ( response [ 4 ] , NULL , 10 ) ; int exp = strtol ( response [ 6 ] , NULL , 10 ) ; inv [ j ] . id = pos ; inv [ j ] . publicacao = pub ; inv [ j ] . exemplares = exp ; strcpy ( inv [ j ] . titulo , response [ 1 ] ) ; strcpy ( inv [ j ] . autor , response [ 2 ] ) ; strcpy ( inv [ j ] . genero , response [ 3 ] ) ; strcpy ( inv [ j ] . editora , response [ 5 ] ) ; } FILE * ident ; ident = fopen ( " " , " " ) ; if ( ident == NULL ) { fseek ( fp , 0 , SEEK_END ) ; if ( ftell ( fp ) != 0 ) { * cont = inv [ contar ( inv ) ] . id + 1 ; } } else { char num [ 2 ] ; fscanf ( ident , " \n " , num ) ; int leitura = strtol ( num , NULL , 10 ) ; * cont = leitura ; fclose ( ident ) ; } fclose ( fp ) ; } else { printf ( " ") ; } }
loga os dados do arquivo para o struct
loga os dados do arquivo para o struct
//quebra uma linha do arquivo pelo |
 //função strtok le todos o caracteres até o pipe
 //le as outras propriedades entre os pipes até o retorno ser nulo
 //copia a propriedade lida para o array response
 //quando a strtok é chamada com NULL ela continua a ler do stream de sua ultima chamada, asism lendo todas as propriedades entre os pipes
 //aumenta o iterador
 //iteradores
 //array de strings auxiliares
 //volta ao inicio do arquivo
 //se o final do arquivo NÃO foi atingido
 //usa o fscanf para ler do arquivo, com a diletiva %[^\n] ele para a leitura quando achar um \n
 //checa novamente se é o fim do arquivo. Isso é feito pois se o stream estiver no final do arquivo, move-lo para frente ira voltar ao inicio do arquivo
 //move o stream 1 caractere da posição atual.
 //iterador
 //itera sobre a contagem de linhas/entradas do arquivo
 //array de strings auxiliar
 //chama a função tokenize para cada uma das linhas, que irá retornar as propriedades individuais da entrada
 //conversões de char para int usando a função strtol(string, ponteiro, base). 
 //pos é o id da entrada
 //pub é o ano de publicação da entrada
 //exp é o numero de exemplares da entrada
 // escreve o id, ano de publicação e número de exemplares da entrada no struct
 //copia titulo, autor, editora e genero para o heap
 //===== essa parte do código garante que os ID's sejam únicos =======
 //abre o arquivo do contador para leitura
 //se ele não existir:
 //move o stream para o final do arquivo
 //se o db.txt NÃO estiver vazio, altera o contador para o ultimo id do struct +1
 //o contador retornado será o numero de entradas do struct +1
 //caso contrário:
 //cria string auxiliar num
 //le até o fim da linha
 //converte a string lida para int
 //o valor do contador agora será o valor lido do arquivo.
 //fecha o arquivo
