1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C -> números e data automáticos

Discussão em 'Programação' iniciada por X3minater, 29 de Dezembro de 2007. (Respostas: 7; Visualizações: 898)

  1. X3minater

    X3minater Power Member

    Boas
    - Alguém sabe como se faz para atribuir um número (ex:ID) automatico e sequencial (1,2,...n)? E se eu o guardar num ficheiro, como é que eu faço para depois recomeçar a partir daí???

    - E a data? Como é que se faz para por a data actual num ficheiro? Tenho de usar o <time.h> e mais o que?
     
  2. Baderous

    Baderous Banido

    1 - Ciclo for? A 2ª parte não percebi.
    2 - Existe uma macro pré-definida __DATE__ que te dá uma string no formato "MMM DD YYYY". Não sei se é isto...
     
  3. souto

    souto To fold or to FOLD?

    A forma mais straight-forward é teres uma função com um static int.
    Por ex.

    Código:
    int getNext() {
      static int next = 0;
      return next++;
    }
    O valor é inicializado quando a função é chamada pela primeira vez, e mantido ao longo da execução do programa.
    Onde tens o zero, podes ter um valor que lês dum outro lado qualquer.

    Cumprimentos.
     
  4. X3minater

    X3minater Power Member

    Sim, tinha pensado no for também, mas imagina que guardavas essa sequencia no ficheiro (até ao 5 por exemplo) e depois saias do programa... depois entravas outra vez no programa e como é que recomeçavas a sequencia a partir do 5???


    Até deve ser...mas como é que uso isso?
     
  5. Antonio Raimund

    Antonio Raimund Power Member

    Crias uma variavel global com esse numero.
    Ou seja na função intnextgen() crias a sequência mas guardas na variavel global.
    Quando voltares a ler o ficheiro ele carrega essa variavel global e volta a chamar a intnextgen().
    Quanto à data penso que se é uma macro apenas terás de chamar a biblioteca dela ou fazer um define?
    Ideias?
     
  6. Baderous

    Baderous Banido

    A macro já está pré-definida.

    Código:
    printf("Data: %s",__DATE__);
    Dá-te a data actual.
     
  7. X3minater

    X3minater Power Member

    E como é que eu faço isso sem usar variáveis globais?:D (não posso usar)

    EDIT:
    Thanks! ;)
     
    Última edição: 29 de Dezembro de 2007
  8. z80

    z80 Power Member

    Nunca concordei muito com toda essa `evangelização anti-globais` quando se programa em C. Se forem bem usadas e documentadas... Noutras linguagens concordo que não se usem globais.

    Mas para o teu problema não precisas de globais, usa a ideia do souto dos statics. Mas se permitires que o teu gerador receba um argumento ("inicializar" e "obter-proximo-id") entao penso que já tens o que pretendes.

    Código:
    #include <stdio.h>
    #include <limits.h>
    
    #define NEXT 0
    #define INIT 1
    #define INIT_NEEDED -INT_MAX
    #define ID_GEN_FILENAME "id-inicial.txt"
    
    /* o gerador recebe uma operacao a realizar:
     * NEXT: obter proximo id
     * INIT: inicializar o gerador a partir do ficheiro ID_GEN_FILENAME
     *
     * se devolver INIT_NEEDED entao o gerador necessita de inicializacao
     * (nao deve ser invocado NEXT antes de um INIT)
     */
    int idGenerator(int op) {
    
        static id = INIT_NEEDED;
        
        switch(op) {
            case NEXT:
            {
                return id++;
            }
            case INIT:
            {
            FILE * idfile;
                int savedID;
                if ((idfile = fopen(ID_GEN_FILENAME,"r")) != NULL) {
                     /* TODO - verificar que existe um valor no ficheiro */
                     fscanf(idfile,"%d",&savedID);
                     id = savedID;
                     fclose(idfile);
                }
                break;
            }
        default : id = INIT_NEEDED; //op desconhecida invalida o estado do gerador(?)
        }
        return id;
    }
    
    int main() {
    
        //inicializar o gerador de id's
        idGenerator(INIT);
    
        //obter 10 id's diferentes
        int i;
        for(i = 0; i < 10; ++i) {
            printf("%d\n", idGenerator(NEXT));
        }
        
        //voltando a inicializar, a contagem recomeça
        idGenerator(INIT);
        printf("\n");
        for(i = 0; i < 10; ++i) {
            printf("%d\n", idGenerator(NEXT));
        }
    }
    
    /* (nao testado exaustivamente ;) */
    
     

Partilhar esta Página