Ordenar Estructuras

Iniciado por Ezio_Auditore, 15 Diciembre 2010, 09:25 AM

0 Miembros y 1 Visitante están viendo este tema.

Ezio_Auditore

Hola a todos. Necesito, si sois tan amables, que me echeis un cable con un ejercicio que tengo de clase. No se cómo hacerlo y me veo con la necesidad de recurrir a este fantastico foro. Mi problema es el siguiente: Tengo el siguiente programa y lo que necesito es que la salida de los datos los saque de forma ordenada y bien colocada,  es decir, cada permiso debajo de su permiso, cada usuario debajo de su usuario... (que no salga de forma escalonada y ordenado). No se si me he explicado bien. Bueno os dejo el programa para que lo veais:

#include <dirent.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#define LEN_DIR 255

#define max(a,b) ((a)>(b))?(a):(b)

void directorio(char * directorio) {
    char ruta[LEN_DIR];
    DIR * dir;
    struct dirent * entrada = (struct dirent *) malloc(sizeof(struct dirent));
    struct stat * estado = (struct stat *) malloc(sizeof(struct stat));
    struct passwd * usuario = (struct passwd *) malloc(sizeof(struct passwd));
    struct group * grupo = (struct group *) malloc(sizeof(struct group));
    struct tm * hora = (struct tm *) malloc(sizeof(struct tm));

    long int mayorBloque = 0;
    long int mayorEnlace = 0;
    long int mayorTamano = 0;
    long int sumaBloques = 0;

    if ((dir = opendir(directorio)) != NULL) {
        while ((entrada = readdir(dir)) != NULL) {
            if (entrada->d_name[0] == '.') continue; // <=== No me interesan los ficheros ocultos
            sprintf(ruta, "%s/%s", directorio, entrada->d_name);
            if (stat(ruta, estado) == 0) {
                // Tamaño
                //printf("%li ", estado->st_blksize);
                printf("%li ", estado->st_blocks/2);
                mayorBloque = max(mayorBloque, estado->st_blocks/2);
                sumaBloques += estado->st_blocks/2;
                // Tipo de fichero
                if (S_ISREG(estado->st_mode)) printf("-");
                else if (S_ISDIR(estado->st_mode)) printf("d");
                else if (S_ISLNK(estado->st_mode)) printf("l");
                else printf("?");
                // Permisos
                // printf("%o ", estado->st_mode % 01000);
                printf(estado->st_mode & S_IRUSR ? "r" : "-");
                printf(estado->st_mode & S_IWUSR ? "w" : "-");
                printf(estado->st_mode & S_IXUSR ? "x" : "-");
                printf(estado->st_mode & S_IRGRP ? "r" : "-");
                printf(estado->st_mode & S_IWGRP ? "w" : "-");
                printf(estado->st_mode & S_IXGRP ? "x" : "-");
                printf(estado->st_mode & S_IROTH ? "r" : "-");
                printf(estado->st_mode & S_IWOTH ? "w" : "-");
                printf(estado->st_mode & S_IXOTH ? "x" : "-");
                // Enlaces
                printf(" %d ", estado->st_nlink);
                mayorEnlace = max(mayorEnlace, estado->st_nlink);
                // Usuario
                // printf(" %d ", estado->st_uid);
                usuario = getpwuid(estado->st_uid);
                printf("%s ", usuario->pw_name);
                // Grupo
                // printf(" %d ", estado->st_gid);
                grupo = getgrgid(estado->st_gid);
                printf("%s ", grupo->gr_name);
                // Tamaño
                printf("%li ", estado->st_size);
                mayorTamano = max(mayorTamano, estado->st_size);
                // Fecha de última modificación
                hora = localtime(&estado->st_mtime);
                printf("%04d-%02d-%02d %02d:%02d ",
                            hora->tm_year+1900, hora->tm_mon+1, hora->tm_mday,
                            hora->tm_hour, hora->tm_min);
            }
            // Nombre
            printf("%s\n", entrada->d_name);
        }
        closedir(dir);
        printf("total %li\n", sumaBloques);
    }
}

/**
total 468
400 -rw-------   1 usuario usuario  408984 2010-12-01 17:48 autosave.xmi
  4 drwx------   2 usuario usuario    4096 2010-11-21 16:16 bin
  4 drwxr-xr-x   5 usuario usuario    4096 2010-12-03 16:31 Descargas
  8 -rwxr-xr-x   1 usuario usuario    7597 2010-11-30 21:19 directorio
  4 -rw-r--r--   1 usuario usuario    1450 2010-11-30 21:19 directorio.c
  4 -rw-r--r--   1 usuario usuario    1736 2010-11-30 21:08 directorio.o
  4 drwxr-xr-x  14 usuario usuario    4096 2010-11-15 16:58 Documentos
  4 drwxr-xr-x   8 usuario usuario    4096 2010-11-12 20:25 Dropbox

%*li %s %*d %*s %*s %*li %04d-%02d-%02d %02d:%02d %s  <= FORMATO

  4 drwxr-xr-x   2 usuario usuario    4096 2010-12-02 14:04 Escritorio
  4 -rw-r--r--   1 usuario usuario     179 2010-11-11 11:47 examples.desktop
  4 drwxr-xr-x 138 usuario usuario    4096 2010-12-01 17:17 Imágenes
  4 drwxr-xr-x   2 usuario usuario    4096 2010-11-11 11:56 Música
  4 drwxr-xr-x   2 usuario usuario    4096 2010-11-11 11:56 Plantillas
  4 drwxr-xr-x   4 usuario usuario    4096 2010-12-03 16:31 pruebas
  4 drwxr-xr-x   2 usuario usuario    4096 2010-11-11 11:56 Público
  4 drwxr-xr-x   4 usuario usuario   4096 2010-12-01 17:28 uml-generated-code
  4 drwxr-xr-x   2 usuario usuario   4096 2010-11-11 11:56 Videos
**/
int main(int argc, char ** argv) {
    char ruta[LEN_DIR] = ".";

    // Lectura de parámetros
    switch (argc) {
        case 1: // Listar directorio actual
            strcpy(ruta, ".");
            break;
        case 2: // Listar el directorio argv[1]
            strcpy(ruta, argv[1]);
            break;
        default:
            fprintf(stderr, "Uso: %s [<directorio>]\n", argv[0]);
            return 1;
    }

    // Llamada a la función que lista el directorio
    directorio(ruta);
    return 0;
}



Muchas gracias