Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

scandir

22 réponses
Avatar
matt
Bonjour,

J'utilise la fonction scandir pour lister un repertoire comme suit :

n = scandir(".", &filelist, 0, alphasort);

mais je voudrais mettre un filtre du style *.txt mais je ne vois pas
comment faire ?

Ca se passe au niveau du 3eme paramètres, un pointeur de fonction mais
pour la suite ???

Pourriez vous m'aider ?

Merci pour vos réponses,

Matt.

PS : si HS pouvez vous m'indiquer le bon groupe.

2 réponses

1 2 3
Avatar
Antoine Leca
En news:462a30e9$0$5103$,
matt va escriure:
et ceci :

if(name[--len] == 't' && name[--len] == 'x' && name[--len] == 't'
&& name[--len] == '.')


Je ne suis pas sûr que ce soit gagnant (par rapport à memcmp, s'entend) : en
utilisant --len, tu forces 4 mises-à-jour de la variable len, autrement dit
tu génères des instructions d'écriture qui vont détériorer les performances
du pipeline.


À moins d'avoir un compilateur suffisament performant qui va réécrire cela
en

if(name[len-1] == 't' && name[len-2] == 'x' && name[len-3] == 't'
&& name[len-4] == '.')

mais là l'intérêt est réduit, vu que le même compilateur va probablement
générer un code très semblable (seule différence visible, l'ordre des
comparaisons) avec memcmp().


En fait, le compilateur va *considérer* ce code-là si tu écris memcmp();
mais il peut aussi décider de générer un truc genre :

if( *(int32_t*)(name+len-4) == '.txt' ) return 1;

ou

if( *(int16_t*)(name+len-4) == '.t'
&& *(int16_t*)(name+len-2) == 'xt' ) return 1;

si les accès non-alignés (avec proba 75% ou 50%) ne sont pas trop chers, ou
si tu priorises la taille du code. On peut aussi avoir une version plus
compliquée qui teste la parité de name+len, genre :

if( name+len & 1 ) {
if( name[len-4] == '.'
&& *(int16_t*)(name+len-3) == 'tx'
&& name[len-1] == 't' ) return 1;
} else
if( *(int16_t*)(name+len-4) == '.t'
&& *(int16_t*)(name+len-2) == 'xt' ) return 1;

Bref, en règle générale cela vaut la peine de laisser faire le compilateur
et la bibliothèque standard, cela fait moins de code à écrire et le résultat
est plus facile à comprendre, à vérifier, à dépanner, à changer si
l'extension passe de ".txt" à ".resultats", etc.


Antoine

Avatar
matt
En news:462a30e9$0$5103$,
matt va escriure:
et ceci :

if(name[--len] == 't' && name[--len] == 'x' && name[--len] == 't'
&& name[--len] == '.')


Je ne suis pas sûr que ce soit gagnant (par rapport à memcmp, s'entend) : en
utilisant --len, tu forces 4 mises-à-jour de la variable len, autrement dit
tu génères des instructions d'écriture qui vont détériorer les performances
du pipeline.


À moins d'avoir un compilateur suffisament performant qui va réécrire cela
en

if(name[len-1] == 't' && name[len-2] == 'x' && name[len-3] == 't'
&& name[len-4] == '.')

mais là l'intérêt est réduit, vu que le même compilateur va probablement
générer un code très semblable (seule différence visible, l'ordre des
comparaisons) avec memcmp().


En fait, le compilateur va *considérer* ce code-là si tu écris memcmp();
mais il peut aussi décider de générer un truc genre :

if( *(int32_t*)(name+len-4) == '.txt' ) return 1;

ou

if( *(int16_t*)(name+len-4) == '.t'
&& *(int16_t*)(name+len-2) == 'xt' ) return 1;

si les accès non-alignés (avec proba 75% ou 50%) ne sont pas trop chers, ou
si tu priorises la taille du code. On peut aussi avoir une version plus
compliquée qui teste la parité de name+len, genre :

if( name+len & 1 ) {
if( name[len-4] == '.'
&& *(int16_t*)(name+len-3) == 'tx'
&& name[len-1] == 't' ) return 1;
} else
if( *(int16_t*)(name+len-4) == '.t'
&& *(int16_t*)(name+len-2) == 'xt' ) return 1;

Bref, en règle générale cela vaut la peine de laisser faire le compilateur
et la bibliothèque standard, cela fait moins de code à écrire et le résultat
est plus facile à comprendre, à vérifier, à dépanner, à changer si
l'extension passe de ".txt" à ".resultats", etc.


Antoine



Bonsoir,

Je te remercie pour ces précisions, et je pense que je vais opter pour
un memcmp (qui est preferable à un strcmp ou strncmp ?)

Matt...


1 2 3