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:
Muchas gracias
Código (c) [Seleccionar]
#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