Jump to content

Recommended Posts

Posted

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.

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.