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?
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...
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.
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?
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?
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 ;) */