FasTer Posted May 15, 2009 at 08:55 AM Report #264299 Posted May 15, 2009 at 08:55 AM Pois bem pessoal , estou aqui com um problema , o meu projecto de algoritmia consiste num programa que quer listar todos os ficheiros de uma directoria e depois fazer umas coisitas com eles , até aqui tudo , está tudo a correr bem o pior é que está a acontecer um erro estúpido . Por exemplo quero , os 5 maiores ficheiros de uma directoria o programa da-me exactamente os 5 maiores ficheiros , mas depois na 2º tentativa se eu pedir os 5 já nao me dá os 5 mas sim os 6. A partir da 2º tentativa dá sempre +1 do que eu peço. Não estou a entender de onde vem este erro porque supostamente a variável "nficheiros" e a variável "k"( refere-se ao numero de ficheiros maiores ) é apagada... Como é isto possível? Vou deixar aqui a função para se alguém tiver paciência me ajudar. #include <stdio.h> #include <stdlib.h> #include <io.h> #include <locale.h> #define FILENAME_MAXSIZE 260 #include <conio2.h> #include <string.h> void ledirectoria2()//Função que lê a directoria desejada { char caminhopasta[FILENAME_MAXSIZE]; clrscr(); printf("Escreva a directoria desejada\n\n"); fgets(caminhopasta, 120, stdin); //le um caminho para a pasta a listar caminhopasta[strlen(caminhopasta)-1]='\0'; //retira newline no fim da linha ordenaficheiros(caminhopasta); return 0; } void ordenaficheiros(char * caminho)//Função que lista todos os ficheiros da directoria introduzida pelo utilizador { clrscr(); char directoria[FILENAME_MAXSIZE]; struct _finddata_t info; long cod, handler; int subdir, nficheiros=0,vtamanho[5000],maior,pos,i,j,kmaiores; _chdir(caminho); // muda a directoria actual para a pasta a listar handler = _findfirst("*.*", &info); // filtro para listar todos os ficheiros dessa pasta cod = handler; if ( _getcwd( directoria, FILENAME_MAXSIZE ) != NULL ) printf("Introduza o nº de ficheiros: "); scanf("%d",&kmaiores); printf( "....:::Lista de Ficheiros:::....\n\n"); printf("Ficheiros na directoria %s\n", directoria); while (cod >= 0) { // Vamos apenas listar os ficheiros na memoria , nao os vamos imprimir , desta maneira obtemos o numero de ficheiro na pasta if (!(info.attrib & _A_SUBDIR)) { vtamanho[nficheiros]= info.size; // armazenamos o tamanho de cada ficheiro na posiçao nficheiros nficheiros=nficheiros + 1; // incrementamos a variavel nficheiros } cod = _findnext(handler, &info); } // este algoritmo vai-nos organizar o tamanho dos ficheiros de forma crescente , dessa maneira irá ser fácil os k mai for (i = nficheiros; i >= 2; i--) { /*coloca o maior número de x[1] até x[i] em maior*/ maior = vtamanho[1]; pos = 1; /*pos contem a posição do maior*/ for (j = 2; j<= i; j++) /*compara o maior com os restantes*/ if (vtamanho[j] > maior) { maior = vtamanho[j]; pos = j; }; /* coloca o maior na posição i, colocando x[i] na posição anterior do maior */ vtamanho[pos] = vtamanho[i]; vtamanho[i] = maior; } _chdir(caminho); // muda a directoria actual para a pasta a listar handler = _findfirst("*.*", &info); // filtro para listar todos os ficheiros dessa pasta cod = handler; if ( _getcwd( directoria, FILENAME_MAXSIZE ) != NULL ) while (cod >= 0) { // Vamos apenas listar os ficheiros na memoria , nao os vamos imprimir , desta maneira obtemos o numero de ficheiro na pasta if (info.size>=vtamanho[(nficheiros+1)-kmaiores]) if (!(info.attrib & _A_SUBDIR)) { textcolor(YELLOW); printf("\nNome: %s\n", info.name); printf("Tamanho(bytes): %d ;\n", info.size); printf("Modificado em: %s\n", ctime(&info.time_write)); } cod = _findnext(handler, &info); } _findclose(handler); printf("Existem %d ficheiros na directoria\n\n\n", nficheiros); // diz-nos o numero de ficheiros atraves da variavel nfciheiros que foi incrementada no ciclo. textcolor(WHITE); printf ("** Prima qualquer tecla para voltar ao menu anterior **\n\n"); } Só estão aqui 2 funções do programa... A 1º para ler a directoria e a 2º para brincar com os ficheiros listados da directoria , alguma ideia? Só falta mesmo isto para o programa ficar perfeito.
FasTer Posted May 15, 2009 at 09:21 AM Author Report #264306 Posted May 15, 2009 at 09:21 AM Uma maneira que pensei foi fazer o reset a todas as variáveis da função assim que executo essa função a 1º vez. É possível fazer isso? como? Assim não há maneira de falhar. Cumps
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now