Problème compatibilité librairie MAC et UBUNTU

Fermé
LUFFYroooo Messages postés 14 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 6 juillet 2017 - Modifié le 3 juil. 2017 à 06:26
LUFFYroooo Messages postés 14 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 6 juillet 2017 - 6 juil. 2017 à 22:25
Bonjour,

Je souhaite recoder la fonction "ls" dans le cadre d'un projet pour mon école.

Le soucis est que je dispose d'un environnement Ubuntu alors qu'a mon école nous avons des macs.

J'utilise donc la fonction "opendir" de "sys/stat.h", je vous met le code pour vous aider a comprendre mon problème :



#include "ls.h"

void ft_ls_name(int argc, char **argv)
{
DIR *rep;
int i;
struct dirent *ent;

i = 1;
while(i < argc)
{
rep = opendir(argv[i]);
if (rep != NULL)
{
while ((ent = readdir (rep)) != NULL)
ft_putendl(ent->d_name);
closedir(rep);
}
i++;
}
}

int main(int argc, char **argv)
{
ft_ls_name(argc, argv);
return (0);
}



Le retour sur Mac, grâce a la fonction d'affichage me permet d'avoir tout les "noms" trié par ordre Ascii, exemple :

MAC : (sans fonction de trie)

.
..
libft
ls
ls.h
main.o
main.c
Makefile

Ubuntu : (sans fonction de trie)

.
main.o
Makefile
..
ls
main.c
libft
ls.h

J'aimerais donc savoir si quelqu'un avais une solution a m'apporter pour Ubuntu,peut-être remplacer sys/types.h par celui de mac ?

Je ne veux pas faire de fonction de trie car je compte ne rien stocker, pour que le programme sois plus rapide !

Merci, Luffy

A voir également:

1 réponse

[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
3 juil. 2017 à 12:39
Salut LUFFYroooo,

1. rien ne garantit que readdir() renvoie un résultat classé
2. ls, en revanche doit renvoyer par défaut un résultat classé alphabétiquement, sauf options particulières
3. si tu veux te reposer sur une fonction POSIX faisant le travail pour toi, tu peux utiliser scandir()
4. tu peux aussi faire le tri toi même


Dal
0
LUFFYroooo Messages postés 14 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 6 juillet 2017
3 juil. 2017 à 19:42
Merci de ta reponse !

Mais justement, sur MAC(du moins a mon ecole (42)) la fonction readdir renvoie le résultat classer par ordre ASCII tandis que sur Ubuntu non !

Je n'est pas le droit d utiliser la fonction scandir() dans le cadre de mon projet a part si je recode cette fonction.

Et pour le trie, je ne peux pas faire de trie car je ne veux rien stocker pour que le programme sois trés rapide sur un "ls -R /", je profite donc du fait que sur mac le resultat sois trié !

Le temps gagner est peut etre infime pour un humain, mais je n'ai pas non plus le droit de dépasser ma stack ! C est pour cela que je ne veux pas stocker les donnés (meme si, je suis d'accord que sa resouderais mon probleme)

Merci !
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
Modifié le 4 juil. 2017 à 10:45
readir est conforme à la norme POSIX sous Linux, et cette norme n'oblige pas à garantir que readdir() renvoie un résultat classé par ordre alphabétique, contrairement à ls, qui elle, est une commande POSIX qui doit renvoyer un résultat classé par ordre alphabétique par défaut (liens vers les pages Open Group).

Si tu te bases sur le fait que l’implémentation de readir sous Mac serait classée, ton code pour ls sera plus rapide, mais ne sera pas portable (sous réserve, que, effectivement, tu puisses considérer comme acquis que ce comportement sous Mac est avéré - est-il spécifié dans une documentation officielle d'Apple ?).

Si la question de la portabilité n'est pas un problème pour toi, dans ton cas, tant mieux, et alors je ne vois pas quelle "solution" à quel problème tu cherches.

Est-ce que tu cherches seulement à simuler sous Linux, pour les besoins de ton développement sous Linux seulement, le comportement de readir sous Mac ?


Dal
0
LUFFYroooo Messages postés 14 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 6 juillet 2017
5 juil. 2017 à 22:40
Sur la documentation Apple :

The readdir() function returns a pointer to the next directory entry. It returns NULL upon reaching
the end of the directory or on error. In the event of an error, errno will be set to any of the values
documented for the getdirentries(2) system call.


DOnc je ne pense pas que ca sois specifier ! Non la portabilite n est pas un probleme pour le moment, je cherchais juste un moyen d'obtenir le meme resultat, je ferais comme si !

Merci pour ta reponse ! :)
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
6 juil. 2017 à 10:54
tu pourrais faire une compilation conditionnelle en testant
#ifdef __linux__
et dans ce cas ajouter le code nécessaire au classement alphabétique (ou utiliser scandir).
0
LUFFYroooo Messages postés 14 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 6 juillet 2017 > [Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024
Modifié le 6 juil. 2017 à 22:25
Merci de ta réponse, mais au vus des soucis rencontrés pour le trie au cas où les fichiers se nomme ....B et ....a par exemple nous avons décidé d utiliser un trie par insertion dans une liste doublement chaînée ! (La fonction scandir n est pas autorisé)

Merci pour tout, j essayerais ce que tu ma dis pour voir le résultat quand même !
0