• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

FasTer

Bug no meu programa.... Projecto final de algorit e prog. help

2 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora