Difference between revisions of "Esercizio 1, prova pratica 20.06.2013"
Jump to navigation
Jump to search
Line 87: | Line 87: | ||
Problema: Se come parametro gli passo l'indirizzo di una directory diverso da quella in cui si trova il file.c, non funziona, o meglio esegue, termina ma non trova alcun file all'interno della directory (anche se sono sicuro che i file ci sono). | Problema: Se come parametro gli passo l'indirizzo di una directory diverso da quella in cui si trova il file.c, non funziona, o meglio esegue, termina ma non trova alcun file all'interno della directory (anche se sono sicuro che i file ci sono). | ||
+ | |||
+ | |||
+ | == Soluzione di blissett == | ||
+ | <source lang="c"> | ||
+ | #include <stdio.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <dirent.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <unistd.h> | ||
+ | #include <stdlib.h> | ||
+ | |||
+ | |||
+ | #define MAX 1000 | ||
+ | |||
+ | |||
+ | /* struttura che salvera nome e i_node di ogni file presente nella directory */ | ||
+ | typedef struct i_node { | ||
+ | int num; | ||
+ | char *nome; | ||
+ | }i_node; | ||
+ | |||
+ | |||
+ | static int confronto (i_node* elem1, i_node* elem2) | ||
+ | { | ||
+ | return (elem1->num - elem2->num); | ||
+ | } | ||
+ | |||
+ | |||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | int x=0; | ||
+ | int y=0; | ||
+ | DIR *root; | ||
+ | char *buf=malloc (100*(sizeof(char))); | ||
+ | struct dirent *d; | ||
+ | i_node A[MAX]; | ||
+ | |||
+ | if (argv[1]==NULL) | ||
+ | { | ||
+ | |||
+ | getcwd(buf, MAX); /* prendo directory corrente e la salvo in buf */ | ||
+ | if ((root = opendir (buf)) == NULL) | ||
+ | { | ||
+ | perror("opendir"); | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | buf =argv[1]; | ||
+ | if ((root = opendir (buf)) == NULL) | ||
+ | { | ||
+ | perror("opendir"); | ||
+ | return -1; | ||
+ | } | ||
+ | chdir(buf); /*cambio directory corrente con quella passato a linea di comando*/ | ||
+ | } | ||
+ | |||
+ | |||
+ | /* SE VOGLIO STAMPARE SOLO I FILE REGOLARI | ||
+ | while ((d=readdir (root))!=NULL) | ||
+ | { | ||
+ | stat(d->d_name,&f); | ||
+ | if (S_ISREG(f.st_mode)) | ||
+ | { | ||
+ | A[x].nome = d->d_name; | ||
+ | A[x].nodo = d->d_ino; | ||
+ | x++; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | */ | ||
+ | |||
+ | |||
+ | /* scorro tutta la directory */ | ||
+ | while ((d=readdir (root))!=NULL) | ||
+ | { | ||
+ | A[x].nome = d->d_name; | ||
+ | A[x].num = d->d_ino; | ||
+ | x++; | ||
+ | } | ||
+ | |||
+ | qsort(A, x--, sizeof(i_node), confronto); /* riodina seguendo la funzione "confronto" */ | ||
+ | |||
+ | while (y<=x) | ||
+ | { | ||
+ | printf ("\n/%s ------ %d \n", A[y].nome, A[y].num); | ||
+ | y++; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | --[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 09:36, 18 March 2015 (CET) |
Latest revision as of 09:36, 18 March 2015
Scrivere un programma che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.
Soluzione di D.Boldrin
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
typedef struct listnode { //struttura dati per contenere tutti gli inode dei file di una directory
struct listnode *next;
int inode;
}listnode;
int main(int argc, char* argv[]){
struct stat fileStat;
int contanode=0;
char *filename=argv[1];
struct stat tp;
DIR *path;
struct dirent *dir_object;
path = opendir(argv[1]);
listnode *root;
root = (listnode*)calloc(1, sizeof(listnode));
listnode *tmp=root;
dir_object = readdir(path); //comincia la scansione della cartella
while(dir_object != NULL){
stat(dir_object->d_name, &tp);
if (S_ISREG(tp.st_mode)){ //l'oggetto dir_object é un file,quindi lo salvo nella struttura
contanode++;
stat(dir_object->d_name, &fileStat);
tmp->inode=(fileStat.st_ino);
tmp->next=(listnode*)calloc(1, sizeof(listnode));
tmp=tmp->next;
}
dir_object = readdir(path);
}
printf("%d\n", contanode);
ordinaLista(root);
stampaLista(root);
}
void ordinaLista(listnode *pnt){
listnode *tmp=pnt;
int temp;
while(tmp->next!=NULL){
while(pnt->next!=NULL){
if(pnt->inode<tmp->inode){
temp=pnt->inode;
pnt->inode=tmp->inode;
tmp->inode=temp;
}
else{
pnt=pnt->next;
}
}
tmp=tmp->next;
pnt=tmp;
}
}
void stampaLista(listnode *pnt){
while(pnt->next!=NULL){
printf("%d\n",pnt->inode);
pnt=pnt->next;
}
}
Problema: Se come parametro gli passo l'indirizzo di una directory diverso da quella in cui si trova il file.c, non funziona, o meglio esegue, termina ma non trova alcun file all'interno della directory (anche se sono sicuro che i file ci sono).
Soluzione di blissett
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX 1000
/* struttura che salvera nome e i_node di ogni file presente nella directory */
typedef struct i_node {
int num;
char *nome;
}i_node;
static int confronto (i_node* elem1, i_node* elem2)
{
return (elem1->num - elem2->num);
}
int main (int argc, char *argv[])
{
int x=0;
int y=0;
DIR *root;
char *buf=malloc (100*(sizeof(char)));
struct dirent *d;
i_node A[MAX];
if (argv[1]==NULL)
{
getcwd(buf, MAX); /* prendo directory corrente e la salvo in buf */
if ((root = opendir (buf)) == NULL)
{
perror("opendir");
return -1;
}
}
else
{
buf =argv[1];
if ((root = opendir (buf)) == NULL)
{
perror("opendir");
return -1;
}
chdir(buf); /*cambio directory corrente con quella passato a linea di comando*/
}
/* SE VOGLIO STAMPARE SOLO I FILE REGOLARI
while ((d=readdir (root))!=NULL)
{
stat(d->d_name,&f);
if (S_ISREG(f.st_mode))
{
A[x].nome = d->d_name;
A[x].nodo = d->d_ino;
x++;
}
}
*/
/* scorro tutta la directory */
while ((d=readdir (root))!=NULL)
{
A[x].nome = d->d_name;
A[x].num = d->d_ino;
x++;
}
qsort(A, x--, sizeof(i_node), confronto); /* riodina seguendo la funzione "confronto" */
while (y<=x)
{
printf ("\n/%s ------ %d \n", A[y].nome, A[y].num);
y++;
}
}